JavaScript-js关于prototype的一点疑惑

发布于 2017-06-10 19:05:16 字数 182 浏览 1183 评论 1

代码如下:

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 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

虐人心 2017-10-11 06:11:49

用一个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,不是加到原型。

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文