Javascript原型(prototype)继承

标签 javascript

以下代码取自http://bonsaiden.github.com/JavaScript-Garden/

function Foo() {
    this.value = 42;
}
Foo.prototype = {
    method: function() {}
};

function Bar() {}

// Set Bar's prototype to a new instance of Foo
Bar.prototype = new Foo();
Bar.prototype.foo = 'Hello World';

// Make sure to list Bar as the actual constructor
Bar.prototype.constructor = Bar;

我多次遇到过这个解释 “当访问一个对象的属性时,它首先检查该对象自身是否具有该属性,如果没有,则转到该对象的原型(prototype)来查找该属性,依此类推。”

但是由于以下代码的行为,我很难理解这实际上是如何工作的

var test1 = new Bar();
var test2 = new Bar();

test1.value = 24;

现在 value 不是 test1 对象的一部分,但它是其原型(prototype)(即 Foo 对象)的属性,并且由于原型(prototype)是 Foo 对象,所以 Bar 的所有实例都将共享 value 属性,我期望上面的代码要做的是将 value 属性设置为 24,但它会为 test1 对象创建一个名为“value”的新属性,并将其分配为 24,将原型(prototype)中的 value 属性保留为其初始值 42。这听起来不像是共享。 test2.value 的值仍然是 42。当我在 firebug 控制台中查看原型(prototype)链时,它显示 test1 的 value 属性为 24,其原型(prototype)的 value 属性为 42。

这非常令人困惑。有谁知道它为什么会这样吗?

最佳答案

原型(prototype)链仅在读取属性时使用,并且仅当在对象本身中未找到该属性时使用 - 在写入属性值时不使用原型(prototype)链。

一旦您将属性写入对象 (test1.value = 24),原型(prototype)中任何现有的同名“共享”属性都会被隐藏,并且所有后续读取都将访问现在存储在对象本身中的值。

关于Javascript原型(prototype)继承,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10123832/

相关文章:

javascript - Meteor 如何访问服务器端和客户端的 Facebook Graph Api

javascript - 窗口.打开 : is it possible open a new window with modify its DOM

javascript - 为 Phaser 创建碰撞形状

javascript - 无法查看标题/信息窗口

javascript - 将自定义上下文菜单项添加到 elFinder

javascript - 简单的 ng-include 不起作用

javascript - CoffeeScript 函数问题

java - js中转义双引号和其他特殊字符

javascript - JQGrid - 尝试绑定(bind) "new in v4.3.2"事件但没有成功

javascript - 使用连接键将 JS 子对象合并为 JS 对象