为什么原型分配在这里不起作用?

时间:2014-01-02 09:01:44

标签: javascript prototype

var foo = {
    name: "foo"
};

var bar = {};

bar.prototype = foo;

document.writeln("Bar name: " + bar.name + "<br />");

这就是我在浏览器中获得的内容:

Bar name: undefined

为什么会这样?不应该Javascript在栏上查找名字,然后上foo并找到它?为什么它只是未定义?

4 个答案:

答案 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代替。