我正在阅读 kangax 的博客 How ECMAScript 5 still does not allow to subclass an array 。在这里,他使用了与正常原型(prototype)构造不同的子类化方法
BaseClass.prototype = new Superclass();
他正在做的是这样的:
function clone(obj) {
function F() { }
F.prototype = obj;
return new F();
}
and then set-up inheritance like this:
function Child() { }
Child.prototype = clone(Parent.prototype);
有人可以解释一下这种两部分继承方法以及它相对于上面简单的单行方法有什么好处吗?
编辑:我从评论中了解到现在有一个标准 Object.create()
基本上解决了与 clone()
相同的目的方法但是clone()
的这个实现是如何实现的工作?
最佳答案
这是一个有趣的问题。您提供的这段代码(克隆函数)被 Douglas Crockford 称为“原型(prototype)继承”,并进行了描述 in this article on his website.这种模式变得流行并在 ECMA script 5 into Object.create(), if you look at specification of object create 中正式化。 ,它与 Crockford 函数的规范完全相同。 它的使用方式如下:
var Animal = {
species: "mammal",
noises: function () {
console.log("makes noises")
},
actions: ["roll back", "jump up"]
}
var Cat = Object.create(Animal);
Cat.name = "blacky"
Cat.miau = function () {
console.log("miau miau");
}
Crockford 也称之为差异继承,因为在定义子类的新属性时,您只需指定子类和父类(super class)之间的差异。 Cat 现在拥有自己的属性“name”和自己的方法“miau”。
我认为这样做的主要问题是您仍然在实例之间共享引用值,例如数组。
如果我们这样做:
var Cat2 = Object.create(Animal);
Cat2.actions.push("bite Henry");
Cat2.actions
["roll back", "jump up", "bite Henry"]
Cat.actions
["roll back", "jump up", "bite Henry"]
但至少实例原始属性不共享,这很好。
Cat2.name
undefined
Cat.name
"blacky"
关于javascript - 通过clone()实现对象继承是如何工作的?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17628683/