javascript继承:实例vs原型
javascript inheritance: Instance vs prototype
在使用继承时,ChildObject.prototype = new ParentObject();
和ChildObject.prototype = ParentObject.prototype;
之间的区别是什么,哪种方法更好?
我在Douglas Crockford的例子中见过ChildObject.prototype = new ParentObject();
。
无论是。
:
ChildObject.prototype = Object.create(ParentObject.prototype);
ChildObject.prototype.constructor = ChildObject;
与ChildObject
开头的这一行结合:
ParentObject.call(this/*, appropriate args if any*/);
或者如果传递所有参数:
ParentObject.apply(this, arguments); // `arguments` literally -- it's provided by the JavaScript engine
ChildObject.prototype = new ParentObject();
的问题是,如果ParentObject
需要参数,它将不起作用,就像许多(大多数?)构造函数一样。因此,该模式在常见(可能是大多数)情况下不起作用。
ChildObject.prototype = ParentObject.prototype;
的问题是,它们都指向同一个对象。因此,在ChildObject.prototype
上设置属性会使其显示在ParentObject
的实例上(因为您刚刚在ParentObject.prototype
上设置了它)。
Object.create
版本推迟调用ParentObject
,直到你有一个对象初始化,但给你一个对象,你可以把特定的东西ChildObject
实例。(constructor
的反向链接是为了使替换对象看起来像ChildObject
原来的默认对象;这在过去并不重要,但现在ES6在某些情况下使用了它,一些库在ES5和更早的版本之前使用了它[他们只是把它放在那里]。
最后:Object.create
的单参数版本可以在2009年之前的过时浏览器中被屏蔽,当它被添加到ES5中,或者你可以使用工厂函数代替,如果你不喜欢部分屏蔽的东西:
function objectCreate(proto) {
function ctor() { }
ctor.prototype = proto;
return new ctor;
}
我们通常使用原型来提供方法-以避免为每个类实例重复相同的函数。换句话说,对于像…
ChildObject.prototype.foo = function() {
console.log('foo');
};
现在您可能看到了第二种方法的问题:修改ChildObject.prototype
也会修改ParentObject.prototype
(在ChildObject.prototype = ParentObject.prototype
行之后是同一个对象)。这意味着本例中的所有ParentObject
都有foo
方法可供使用。实际上,说ParentObject
是ChildObject
的父是不正确的——它们都有相同的原型链。
然而还有另一个令人讨厌的副作用。想想看:
function ParentObj() {}
function ChildObj() {}
ChildObj.prototype = ParentObj.prototype;
var i = new ParentObj();
console.log(i); // ParentObj {}
var j = new ChildObj();
console.log(j); // ParentObj {}
看,两个原型,因为它们是同一个对象,有相同的constructor
属性。因此,为了区分它们,我们必须在构造函数中引入一些标志,实质上是覆盖已经存在的机制。
如果你这样做
ChildObject.prototype = ParentObject.prototype;
则父级和子级具有相同的原型。对于后者,
ChildObject.prototype = new ParentObject();
子元素的原型是父元素本身
- setInteval vs setTimeout
- $(this).prop('property') vs. this.property
- 使用“;这个“;JavaScript原型方法中的关键字
- 引用类变量中的原型方法
- 如何从对象的原型方法访问JavaScript对象属性
- 为什么要包装每一个原型“;类“;JS中具有匿名函数的对象
- Js.erb VS按钮标记-不'不起作用.为什么?
- reactjs this.refs vs document.getElementById
- Node.js中的JavaScript原型对象效率
- 重载JS'firefox中的对象原型
- javascript原型方法分配VS下划线_.extend
- Javascript:复合设计vs原型设计
- 添加到对象原型Vs简单函数
- javascript继承:实例vs原型
- JS OOP:原型上的方法vs构造函数中的方法
- javascript继承自Vs原型
- 这个在原型函数中vs这个在对象字面函数中
- 对象方法vs原型方法
- 字符串vs数组原型Javascript
- javascript中的原型vs应用