【问题标题】:javascript inheritance why use Object.create? [duplicate]javascript继承为什么使用Object.create? [复制]
【发布时间】:2013-02-24 14:33:50
【问题描述】:

我在 StackOverflow 中看到了这个: https://stackoverflow.com/a/7786090/289246

答案告诉我们:

DynamicBody.prototype = Object.create( PhysicsBody.prototype );

使用 Object.create 的原因是什么?
为什么我们不能直接使用:

DynamicBody.prototype = PhysicsBody.prototype;

?

【问题讨论】:

标签: javascript jquery backbone.js


【解决方案1】:

Javascript 具有基于原型的继承。这意味着,继承直接从对象发生,与从类继承的经典继承不同。

当你这样做时:

Foo.protoype = Bar.prototype - 你从Bar 对象继承了所有变量和方法。但是对Foo 的原型的任何更改都会导致Bar 的原型被更改(由于上述声明, Foo.prototype 引用 Bar.prototype)。

Object.create() 用于向Foo 添加经典继承类属性。因此,您不是直接从对象继承,而是从具有指定原型的Object 继承。在声明Foo.prototype = Object.create(Bar.prototype) 之后对Foo 的任何更改都不会更改Bar

请参阅here 了解更多信息!

【讨论】:

  • 我不会说使用Object.create 是“类似经典的继承”。它只是创建一个具有特定原型的对象,这与每个构造函数的作用相同。
【解决方案2】:

您可以(技术上),但是您对DynamicBody.prototype 所做的任何更改也将在PhysicsBody.prototype 上进行,即它将影响所有PhysicsBody 实例,而这通常不是您想要的。

例子:

function Foo() {};
Foo.prototype.say = function() {
   alert('Foo');
};
var foo = new Foo();

function Bar() {};
Bar.prototype = Foo.prototype;
Bar.prototype.say = function() {
    alert('Bar');
};

foo.say(); // alerts 'Bar'

Object.create 增加了一层间接性。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-03-20
    • 2023-03-20
    • 2012-10-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多