我最近正在学习javaScript并偶然发现了这个
function Polygon() {
this.dimensions = "2d";
this.print = function () {
console.log(" 2d dimensions are easy to work with!");
}
}
function Quad() {
Polygon.call(this);
this.sides = 4;
}
var quad = new Quad();
quad.print();
function Polygon1() {}
Polygon1.prototype.dimensions = "2d";
Polygon1.prototype.print = console.log("2d dimensions are not difficult to work with!");
function Quad1() {
this.sides = 4;
}
Quad1.prototype = Object.create(Polygon1.prototype);
Quad1.prototype.constructor = Quad1;
var quad1 = new Quad1();
quad1.print();
在两种情况下,我都可以调用print函数,所以这两种继承方式有什么区别,或者我在这里做错了什么?
在JavaScript中,它与对象所有权有关。 Object.call不是永久的所有权更改,它本质上是“调用”另一个函数,并将所有权设置为该调用的调用函数,因此将其自己的属性(由this
定义)传递给“所有权”函数。 >
例如
function Polygon() { this.sides = 2; this.dimensions = "2d"; var _this = this; this.print = function () { console.log("%s dimensions are easy to work with!, sides: ", _this.dimensions, _this.sides); } } function Quad() { Polygon.call(this); this.sides = 4; } new Quad().print(); // Outputs: 2d dimensions are easy to work with!, sides: 4
通过以
Polygon.call
作为属性调用this
,它用Quad中的this
代替了Polygon的this
引用,但仅在调用范围内,实质上是将对this
所做的更改复制到多边形,移至四边形this
。
请参见以下示例:
function Polygon(sides) { this.sides = sides; this.dimensions = "2d"; var _this = this; this.print = function () { console.log("%s dimensions are easy to work with!, sides: ", _this.dimensions, _this.sides); } } function Quad() { Polygon.call(this); this.sides = 4; } const poly = new Polygon(2); const quad = new Quad(); quad.print(); // 2d dimensions are easy to work with!, sides: 4 poly.print(); // 2d dimensions are easy to work with!, sides: 2 poly.print !== quad.print; // should return true
使用Object.prototype是不同的,因为您是直接修改对象,而使用Call,则仅在该调用上就调用具有隐式所有权的函数。这两个示例的不同之处在于,原型示例直接在Quad对象上创建了Polygon的实例,而Call从未明确地这样做。
两个方向各有优缺点,测试方法不同,等等。>