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
.
如果你有这样一个函数
javascript
function 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的实例如下
javascript
var a = new A; B.prototype = a; var b = new B
结合下面的等式
javascript
a.__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方法
javascript
B.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