切换对象的原型

Joh*_*ohn 4 javascript

我试图理解原型是如何工作的.为什么下面会破坏?

var A = function A(){this.a = 0},
    aa = new A;

A.prototype = {hi:"hello"};

aa.constructor.prototype //->{hi:"hello"} ok so far :)

aa.hi //undefined?? why? :(
Run Code Online (Sandbox Code Playgroud)

CMS*_*CMS 12

我认为你的意思是在最后一行aa.hi而不是aa.hello.

它给你,undefined因为在新对象()已经创建之后A.prototype分配.aa

在你的第二行:

//...
aa = new A;
//...
Run Code Online (Sandbox Code Playgroud)

这将创建一个从继承的对象A.prototype,在这一刻,A.prototype是一个简单的空对象,从继承Object.prototype.

此对象将继续由对象实例的内部[[Prototype]]属性aa引用.

A.prototype在此之后更改,不会更改aa与该对象之间的直接继承关系.

实际上,没有标准的方法来更改[[Prototype]]内部属性,某些实现允许您通过调用的非标准属性进行访问__proto__.

要获得预期结果,请尝试:

var A = function A () { this.a = 0 };
A.prototype = { hi:"hello" };

var aa = new A;

aa.hi; // "hello"
Run Code Online (Sandbox Code Playgroud)

  • +1 - 可能值得补充一点,如果OP为原型添加了一个属性而不是为它分配一个新对象,那么`aa.hi`将返回"hello". (3认同)