JavaScript-js关于prototype的一点疑惑
代码如下:
function a(){
}
var arr = new Array();
a.prototype = arr;
var as = new a();
arr.push(1);
as.push(2);
as.push(3);
console.log(as);
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(1)
用一个FakeArray模拟Array理解更容易,注意看FakeArray.prototype.push里的两行注释:
function FakeArray() {
this.length = 0;
}
FakeArray.prototype.push = function(x) {
if (!this.hasOwnProperty('length')) {
console.log("length not found");
}
this[this.length] = x; // create numeric attribute
this.length = this.length + 1; // create 'length' attribute (only once)
}
function a(){}
var arr = new FakeArray();
a.prototype = arr;
var as = new a();
arr.push(1);
as.push(2);
as.push(3);
console.log(as)
第一次as.push(2)时,as对象是没有length属性的,所以要从prototype链上找length属性,这时就会找到arr的length,然后把arr.length + 1 付给this.length,然后as有了length。
你可以把a换成:
function a(){
this.length = 0;
}
那么as一开始就有了length,就不会出现上面的结果。
把FakeArray的length也去掉,那么arr一开始也没length:
function FakeArray() {}
FakeArray.prototype.length = 0;
还有,原型的1没有输出是因为1原型的,后来加入的2、3才是as的,as.push把新元素加到了as,不是加到原型。