使用_.extend()进行JavaScript继承

Jie*_*eng 15 javascript oop

什么区别

Employee.prototype = Object.create(Person.prototype);
Run Code Online (Sandbox Code Playgroud)

_.extend(Employee.prototype, Person.prototype);
Run Code Online (Sandbox Code Playgroud)

两者都给出了类似的结果(输出),但是下划线方法似乎将Person.prototype添加到Employee.constructor.prototype中,并且在这里和那里都有很多额外的东西,为什么呢?

纯JS

在此输入图像描述

underscoreJS

在此输入图像描述

一个很好的副作用_.extend是我可以很容易地做多重继承:看起来它不会使原型链更长...

_.extend(Employee.prototype, Person.prototype);
_.extend(Employee.prototype, {
    doSomething: function() {
        return "hi ...";
    }
});
Run Code Online (Sandbox Code Playgroud)

但......

在此输入图像描述

为什么有2个sayHi和doSomething函数?(实际上,当我只做1次延伸时它是一样的).

http://jsfiddle.net/VMqSy/1/

小智 19

随着Employee.prototype = Object.create(Person.prototype);你完全取代了Employee.prototype.

但随着_.extend(Employee.prototype, Person.prototype);你的加入Person.prototype,最重要的是Employee.prototype.

例如,

var a = {var1:1, var2:2};
var b = {var2:4, var3:3};
console.log(_.extend(a, b)); // {var1:1, var2:4, var3:3}
Run Code Online (Sandbox Code Playgroud)

如你所见,a它并没有完全被b它取代,它只是被定义的属性扩展b.