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的区别在哪?
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号
new A操作符会完成以下步骤:1. 创建一个对象
temp = {},2.
temp.__proto__ = A.prototype,3.
A.call(temp, arguments),4.
return temp.如果你有这样一个函数
当你使用
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的实例如下结合下面的等式
所以
b.__proto__.__proto__ = A.prototype,这样你可能看不出来什么东西,我们在A.prototype上添加一个方法sayb及B.prototype上都没有当我们调用
b.say()时,由原型链,log出‘A say’.若果我们也为B.prototype添加上say方法
再调用b.say()时,是‘B say’。这正是继承与覆写
补充一点:
__proto__是隐藏属性,但chrome和firefox是能访问的去看js的原型链继承,这是js的基础啊
建议花点时间读读这篇文章
再谈Javascript原型继承,读到圣杯模式即可。
#重要提醒#文章作者自己的办法代码有BUG,条件表达式符号顺序搞反了,递归函数似乎无法终止,调用深拷贝继承父类原型函数deepClone(Parent.prototype)没有传入第二个参数等问题。