理解Object.create

时间:2013-04-24 15:29:12

标签: javascript

阅读Object.create文件后。我做了一些测试。 这是我的代码。请查看它。

function Shape() {
  this.x = 0;
  this.y = 0;
}

Shape.prototype.move = function(x, y) {
    this.x += x;
    this.y += y;
    console.info("Shape moved.");
};

Rectangle=Object.create(Shape);

Rectangle.move(); //?? why move function is not found ?

正如文档所说Object.create(proto[,propertiesObject]); proto应该是新创建的对象的原型。 因此,Rectangle.prototype应与Shape相等。但实际上并非如此。显然我不明白这部分文件。我仍然发现Rectangle.__proto__==Shape是真的。好的,即使Rectangle.__proto__==Shape为真,为什么Rectangle无法找到move功能? move函数不在原型链中吗?我认为move函数在Rectangle.__proto__.prototype中,它应该在链中找到。为什么不能?感谢。

2 个答案:

答案 0 :(得分:3)

原型必须是实际的对象。在这种情况下,您应该传递Shape的原型,而不是Shape函数。

function Shape() {
  this.x = 0;
  this.y = 0;
}

Shape.prototype.move = function(x, y) {
    this.x += x;
    this.y += y;
    console.info("Shape moved.");
};

Rectangle=Object.create(Shape.prototype, {a:1});

Rectangle.move(); // it will call now
Rectangle.a; // 1
Rectangle.x; // NaN ???
Rectangle.y; // NaN ???

请注意,Object.create()与使用new关键字不同 - 这可能是您所寻求的。

function Shape() {
  this.x = 0;
  this.y = 0;
}

Shape.prototype.move = function(x, y) {
    this.x += x;
    this.y += y;
    console.info("Shape moved.");
};

Rectangle=new Shape;

Rectangle.move(1,2); // works properly now
Rectangle.a; // undefined, we never made one
Rectangle.x; // 1
Rectangle.y; // 2

由于Javascript实际上查找构造函数及其.prototype以递归方式查找原型,因此它不会查找Shape的原型,因为它没有直接设置,也不是new构造函数用于创建{ {1}}:

Rectangle

答案 1 :(得分:2)

也许这会帮助你理解更多:

https://www.youtube.com/watch?v=DwYPG6vreJg&feature=player_detailpage#t=739s

他在这里解释说它与你说的不一样。 你的论点

  

我认为move功能在Rectangle.__proto__.prototype

是对的。您可以将move视为Rectangle.__proto__.prototype.move,但并不暗示您可以将其Rectangle.move视为function Shape() { this.x = 0; this.y = 0; } Shape.__proto__.move = function(x, y) { this.x += x; this.y += y; console.info("Shape moved."); }; Rectangle=Object.create(Shape); Rectangle.move(); 。原型链被打断了。我认为它在视频中有详细描述。

尝试考虑代码的这些部分:

function Shape() {
    this.x = 0;
    this.y = 0;
}

Shape.prototype.move = function(x, y) {
    this.x += x;
    this.y += y;
    console.info("Shape moved.");
};

Rectangle=Object.create(Shape);

Rectangle.prototype.move();

或:

{{1}}

(在这些情况下,x和y仍然不正确,但你没有询问它们;))