javascript - 通过clone()实现对象继承是如何工作的?

标签 javascript

我正在阅读 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/

相关文章:

尝试隐藏表格行时出现 JavaScript 错误

javascript - Protobuf 非法 Wire 类型

javascript - 如何在 javascript 中将数组从 php 返回到 ajax 响应

javascript - ExtJs 3.4 : Move selected items from one grid to another on a button click

javascript - 使用范围输入触发 jquery 的最佳方法

javascript - 是否有一个格式预设为 'YYYY-MM-DD'

javascript - MooTools:捕获右下角

JavaScript 无法在 Angular 中正确解析 JSON

javascript - 在 JS 中调用二维数组时一直未定义

javascript - 检测具有特定高度的 Draft.js 编辑器的结尾