对 javascript 的构造函数和原型感到困惑吗?

发布于 2024-11-24 22:50:27 字数 204 浏览 0 评论 0原文

function MyObject(){}
Array.prototype={};
MyObject.prototype={};
var a=new Array();
var b=new MyObject();
alert(a.constructor==Array);//true
alert(b.constructor==MyObject);//false
function MyObject(){}
Array.prototype={};
MyObject.prototype={};
var a=new Array();
var b=new MyObject();
alert(a.constructor==Array);//true
alert(b.constructor==MyObject);//false

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

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

发布评论

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

评论(3

不如归去 2024-12-01 22:50:27

Array.prototype 是一个不可写的属性。

因此,您的分配:

Array.prototype = {}

...未成功,因此其 .constructor 属性未更改。

15.4.3.1 Array.prototype

Array.prototype 的初始值是 Array 原型对象 (15.4.4)。

此属性具有属性 { [[Writable]]: false, [[Enumerable]]: false, [[Configurable]]: false }

...而使用自定义构造函数,您可以分配不同的原型对象,因此您已经覆盖了通过 .constructor 引用构造函数的原始对象。

Array.prototype is a non-writable property.

As such, your assignment:

Array.prototype = {}

...doesn't succeed, and so its .constructor property hasn't changed.

15.4.3.1 Array.prototype

The initial value of Array.prototype is the Array prototype object (15.4.4).

This property has the attributes { [[Writable]]: false, [[Enumerable]]: false, [[Configurable]]: false }

...whereas with your custom constructor, you have the ability to assign a different prototype object, so you've overwritten the original which had reference to the constructor via .constructor.

梦魇绽荼蘼 2024-12-01 22:50:27

当您使用自己的空对象实例覆盖 prototype 属性时,constructor 属性将被覆盖,因为 ({}).constructor === Object 。你可以做

function MyObject() {}
MyObject.prototype = {};
MyObject.prototype.constructor = MyObject;

或者(更好的IMO)你不能直接设置prototype,而是增强它:

function MyObject() {}
MyObject.prototype.foo = "bar";

还要注意:Array.prototype不可写,所以你的行< code>Array.prototype = {} 将默默地失败(或在严格模式下大声失败)。

The constructor property is overwritten when you override the prototype property with your own empty object instance, since ({}).constructor === Object. You can do either

function MyObject() {}
MyObject.prototype = {};
MyObject.prototype.constructor = MyObject;

or (better IMO) you can not set prototype directly, but instead augment it:

function MyObject() {}
MyObject.prototype.foo = "bar";

Also of note: Array.prototype is not writable, so your line Array.prototype = {} will silently fail (or noisily fail in strict mode).

放我走吧 2024-12-01 22:50:27
> function MyObject(){} 
> Array.prototype={};

您无法为 Array.prototype 赋值。

> MyObject.prototype={};
> var a=new Array();
> var b=new MyObject();
> alert(a.constructor==Array);//true

Array.prototype 有一个引用 Array 函数的构造函数属性。由于 a 是 Array 的实例,因此它继承了 Array.prototype 的构造函数属性。

> alert(b.constructor==MyObject);//false

您已将一个空对象分配给 MyObject.prototype,它没有 prototype 属性,b 也没有。

MyObject.prototype.constructor = MyObject;

alert(b.constructor==MyObject); // true
> function MyObject(){} 
> Array.prototype={};

You can't assign a value to Array.prototype.

> MyObject.prototype={};
> var a=new Array();
> var b=new MyObject();
> alert(a.constructor==Array);//true

Array.prototype has a constructor property that references the Array function. Since a is an instance of Array, it inherits Array.prototype's constructor property.

> alert(b.constructor==MyObject);//false

You have assigned an empty object to MyObject.prototype, it does not have a prototype property, nor does b.

MyObject.prototype.constructor = MyObject;

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