javascript - ECMAScript 5 定义 - 构造和继承的通用工厂模式,[ Object.create()]

标签 javascript inheritance

ECMAScript 5 已经为构造和继承定义了一个非常通用的工厂模式,叫做Object.create()。我只是将对象传递给 继承并取回一个新对象,所有这些都正确连接。

考虑片段:

var a = {
    phrase: "Hello",
    say: function(){ alert(this.phrase); }
};
var b = Object.create(a);

如下所示,我的理解是否正确?

When b is first created, it has a prototype-inherited property called phrase, meaning that the property is not on the instance (b.phrase), but actually on the prototype (b.prototype.phrase). If I were to read the value of b.phrase at that point, JavaScript would implicitly look it up, find it on the prototype, and return it to me.

b.say(); // alerts Hello

但是,当我为 b.phrase 分配一个新值时,我发现它不会影响继承的 b.prototype.phrase 而是设置(重写)一个优先于继承的实例属性 b.phrase b.prototype.phrase 关于 future 的属性访问。为什么?

b.phrase = "World";
a.say(); // alerts Hello              >> This hasn't changed. Why?
b.say(); // alerts World

最佳答案

发生这种情况是因为原型(prototype)链。 JavaScript 运行时首先查找自己对象的属性,如果没有找到,则查找其原型(prototype)上的属性,依此类推。

另一方面,您并不是覆盖一个属性,而只是将一个属性添加到整个对象,它隐藏原型(prototype)的属性,再一次,这是因为原型(prototype)链的工作原理。

关于javascript - ECMAScript 5 定义 - 构造和继承的通用工厂模式,[ Object.create()],我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34480361/

相关文章:

javascript - 创建[下载]按钮的指令

javascript - jquery Masonry,在div的中心添加一个新的div#container

javascript - Angular .js : Add a class to elements outside of the scope depending on the used route

c++ - 继承类中的 g++ typedef 模板

objective-c - 从父类(super class)的方法实现返回

c++ - 派生类中的显式模板静态成员实例化

javascript - 克隆 javascript 函数,闭包范围

javascript - 为什么在 React 中调用 'setState()' 时使用扩展运算符?

c++ - 我应该在派生类或基类的哪个位置声明友元类?

java - 为什么 method() 和 super.method() 在匿名子类中引用不同的东西?