var foo = {
name: "foo"
};
var bar = {};
bar.prototype = foo;
document.writeln("Bar name: " + bar.name + "<br />");
这就是我在浏览器中获得的内容:
Bar name: undefined
为什么会这样?不应该Javascript在栏上查找名字,然后上foo并找到它?为什么它只是未定义?
答案 0 :(得分:2)
不幸的是,在Javascript x.prototype中!=&#34; x&#34;的原型。 x.prototype
表示&#34;如果x
是构造函数(=函数),x.prototype
将是new x
&#34;的原型。如果x不是函数,x.prototype
没有意义。
这并不比其他语言更令人困惑。请记住,Eich先生只有10天的时间来创建它[ref]。
要将原型分配给已创建的对象,ES6(Harmony)会提供setPrototypeOf
。在其他引擎中,存在特定于供应商的黑客o.__proto__=...
。大多数情况下,这是一个坏主意。
答案 1 :(得分:1)
正如其他人已经正确解释的那样,原型系统不像ECMAscript那样有效。您应该使用ECMAscripts Object.create
方法,这将为您带来魔力。
var foo = {
name: "foo"
};
var bar = Object.create( foo );
console.log("Bar name: " + bar.name);
.create()
几乎可以做到这一点:
Object.create = (function(){
function F(){}
return function( o ){
F.prototype = o;
return new F()
}
})();
答案 2 :(得分:0)
用于JavaScript继承的prototype
属性是构造函数的成员。它不是从构造函数创建的对象的成员。
从构造函数创建的对象具有内部属性[[Prototype]]
,它与构造函数的prototype
属性相同。当您访问对象上的属性并且该对象本身没有该属性时,将在[[Prototype]]
对象中搜索该属性。但[[Prototype]]
属性本身无法从语言中访问(仅出于规范目的)。
答案 3 :(得分:0)
您不能直接在普通对象上设置prototype
属性。
定义(构造函数)函数时,可以指定该函数的prototype
属性,并且随后调用该构造函数时,给定属性将附加到新对象的原型链。
所以这会奏效:
var foo = { name: "foo" };
function Bar() { ... }
Bar.prototype = foo;
var b = new Bar();
// b.name now exists
但是在ES5中,您应该使用Object.create
代替。