我最近一直在回归JavaScript主体的基础知识,在扩展我感兴趣的类时发现了一些细微的变化。我知道有很多选择,但我只关注1,以缩小这个问题的范围。
使用函数扩展类以设置子类原型:
function Shape(){};
function Square(){
Shape.call(this, arguments);
this.sides = 4;
}
function heir(p){
function f(){};
f.prototype = p;
return new f();
}
Square.prototype = heir(Car.prototype);
上面的和以下面的方式设置子类原型之间有什么区别?
Square.prototype = new Car();
使用heir
函数的例子取自O’Reilly的Javascript"权威指南"一书,所以我想知道这样一本像样的书是否有理由使用上面的例子而不是更简单的第二个例子?
您使用的是Object.create 的polyfil
https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/create?redirectlocale=en-美国&重定向段塞=JavaScript%2FReference%2FGlobal_Objects%2FObject%2Create
Child.prototype = Object.create (Parent.prototype);
好处是:
1:父构造函数可能需要传递在声明Child时不可用的其他复杂对象。
2:父实例特定的成员不在Child.prototype上。即使Parent.call(this…在Child构造函数中)会对这些成员进行阴影处理,它们仍然没有业务存在。
这里的更多信息:原型继承-编写