首页 > 请问一下关于js new的一个问题

请问一下关于js new的一个问题

function a(){
    this.a=1;
}
function b(){
    this.b=2;
}
a.prototype.showa=function(){
    console.log("showaaaaaaaa");
}
b.prototype.showb=function(){
    console.log("showbbbbbbb");
} 
// a=new b();//与下面的区别
a.prototype=new b();
console.log(a);
console.log(a.prototype);

上面两个new的区别在哪?


去看js的原型链继承,这是js的基础啊


new A操作符会完成以下步骤:
1. 创建一个对象temp = {},
2. temp.__proto__ = A.prototype,
3. A.call(temp, arguments),
4. return temp.

如果你有这样一个函数

javascriptfunction A (name) {
    this.name = name;
}
A.prototype.age = 12;

当你使用var a = new A('John');时,构造函数返回给你的应该是a = {name: 'John'}.但是实际上你得到的是a = {name: 'John', age: 12}.why?

这就是js的原型链,它规定访问一个对象(a)的属性(age)时a.age,如果在当前对象a上找不到,则它会去它的__proto__属性上找,即a.__proto__.age,而a.__proto__ = A.prototype, 而A.prototype.age = 12,所以a.age会返回12。

以上能解释你的第一个,至于第二个B.prototype = new A,做一下拆分并添加一个B的实例如下

javascriptvar a = new A;
B.prototype = a;
var b = new B

结合下面的等式

javascripta.__proto__ = A.prototype
b.__proto__ = B.prototype
B.prototype = a

所以b.__proto__.__proto__ = A.prototype,这样你可能看不出来什么东西,我们在A.prototype上添加一个方法sayb及B.prototype上都没有

A.prototype.say = function () {
    console.log('A say');
}

当我们调用b.say()时,由原型链,log出‘A say’.
若果我们也为B.prototype添加上say方法

javascriptB.prototype.say = function () {
    console.log('B say');
}

再调用b.say()时,是‘B say’。这正是继承与覆写


补充一点:__proto__是隐藏属性,但chrome和firefox是能访问的


建议花点时间读读这篇文章
再谈Javascript原型继承,读到圣杯模式即可。
#重要提醒#文章作者自己的办法代码有BUG,条件表达式符号顺序搞反了,递归函数似乎无法终止,调用深拷贝继承父类原型函数deepClone(Parent.prototype)没有传入第二个参数等问题。

/*
*赋予变量a一个b的实例,这样之后就无法执行
* var foo = new a();
* 会报Uncaught TypeError: object is not a function错误
*/
a = new b(); 
/*
*这里是修改了a(函数)的原型对象,使得原来a上的原型链关系发生了改变
*仍然可以执行var foo = new a();
*但是foo对象也是b的类型,即执行foo instanceof b结果为true
*/
a.prototype = new b();
function a(){
    this.a=1;
}
function b(){
    this.b=2;
}
a.prototype.showa=function(){
    console.log("showaaaaaaaa");
}
b.prototype.showb=function(){
    console.log("showbbbbbbb");
}
function (){
    console.log("showbbbbbbb");
}
var foo1 = new a();

foo1 instanceof a //true
foo1 instanceof b //false
a.prototype = new b()

var foo2 = new a();

foo2 instanceof a //true
foo2 instanceof b //true
【热门文章】
【热门文章】