如何在非ES5中实现Object.create()

时间:2014-08-30 19:49:27

标签: javascript prototypal-inheritance

我最近一直在阅读有关Javascript的大量书籍和文章,并且在非ES5环境中被Object.create的可接受版本所困扰。 Douglas Crockford和Stoyan Stefanov都提到了在非ES5环境中重新创建Object.create功能的方法,虽然它们的功能名称不同,但您可以看到下面的实现:

function inherit(child, parent) {
    var f = function() {};
    f.prototype = parent.prototype;
    c.prototype = new f();
}

我知道您不希望直接复制原型,因此该函数充当代理 - 防止更改父原型导致子问题。我不明白为什么使用新功能?这不是一样的:

function inherit(child, parent) {
    var o = {}:
    o.prototype = parent.prototype;
    c.prototype = o;
}

有人可以澄清他们为什么不同以及他们为什么选择第一个版本而不是我的版本(这看起来做同样的事情?) - 提前谢谢!

修改

以下是一些测试代码:

//inherit that uses a function as a proxy and creates a new instance as the child prototype
function inherit1(child, parent) {
    var f = function() {};
    f.prototype = parent.prototype;
    child.prototype = new f();
}

//inherit that stores prototype on an object and passes that to a prototype of the child
function inherit2(child, parent) {
    var o = {};
    o.prototype = parent.prototype;
    child.prototype = o;
}

//Begin test for inherit1
function parent1() {}
parent1.prototype.talk = function() {console.log("from parent1 prototype");};

function child1() {}

inherit1(child1, parent1);

var kid1 = new child1();

kid1.talk(); //"from parent1 prototype"

//Begin test from inherit2
function parent2() {}
parent2.prototype.talk = function() {console.log("from parent2 prototype");}

function child2() {}

inherit2(child2, parent2);

var kid2 = new child2();

kid2.talk(); //kid2.talk() is not a function 
kid2.prototype.talk() //"from parent2 prototype"

//这里发生了什么?要使原型继承工作,是否必须从函数继承?

1 个答案:

答案 0 :(得分:0)

用笔和纸画出物体让我理解为什么遗产2没有像我预期的那样工作......但这不是原始问题。

我需要知道的一切都可以在本文中找到:http://sporto.github.io/blog/2013/02/22/a-plain-english-guide-to-javascript-prototypes/

它非常短暂,但仍然需要几个读取才能进入。elclanrs指出我正确的方向,提到原型和[[原型]]之间的区别