gpt4 book ai didi

javascript - javascript中的继承模式

转载 作者:行者123 更新时间:2023-12-04 00:46:33 24 4
gpt4 key购买 nike

这是一个非常古老的主题,已经写了很多,但我还没有找到关于它的确切说法,所以请多多包涵。

在花了一些时间尝试了解 JavaScript 中的 newf.prototype 构造函数构造,并阅读了它如何成为一种原型(prototype)语言之后,更不用说 Crockford 对该主题的启发性评论,我得出的结论是,如果有人愿意,以下是在 JavaScript 中模拟传统的基于类的继承的一种更自然的方法:

// emphasise that there's no superclass instead of writing A = {}
var A = Create.object(null);

// define the 'instance initializer', which half of what a constructor is
A.init = function(x, y) {
this.x = x;
this.y = y;
return this;
}

// a method
A.sum = function() {
return this.x + this.y;
}

// instantiate A
var a = Object.create(A).init(3);

// a subclass
var B = Object.create(A);

B.init = function(x, y, w) {
A.init.call(this, x, y);
this.w = w;
return this;
}

B.weightedSum = function() {
return (1.0 - this.w) * this.x + this.w * this.y;
}

// instantiate B
var b = Object.create(B).init(1, 2, 0.3);

// equivalent of `instanceof`
var bInstanceOfA = A.isPrototypeOf(b);

我喜欢它的一点是它揭示了真正发生的事情,因为对象创建(适用于实例化和子类化)和初始化(仅适用于实例化)之间存在明确的分离。在创建基类和子类之间也存在对称性。代码不需要外部定义的函数或库,但也不是特别冗长。

因此,我的问题如下:那些对 JavaScript 有更多经验的人能否告诉我我没有考虑的方法是否存在问题,或者它是否是一个好的模式?

最佳答案

用这种方法你失去了一个 new 关键字。所以你不能说 new A(128, 256)

但是您可以使用 Object.create() 进行原型(prototype)继承,并使用 new 关键字以这种方式创建常规对象:

var Employee = function(name) {
this.name = name;
return this;
};

Employee.prototype = {
doWork: function() {
console.log('%s is doing some abstract work', this.name);
}
};

var Driver = function(name) {
return Employee.call(this, name);
};

Driver.prototype = Object.create(Employee.prototype, {
doWork: {
value: function() {
console.log('%s is driving a car', this.name);
}
},
fixEngine: {
value: function() {
console.log('%s is fixing an engine', this.name);
}
}
});

var employee = new Employee('Jim');
var driver = new Driver('Bill');

employee.doWork(); // Jim is doing some abstract work
driver.doWork(); // Bill is driving a car
driver.fixEngine(); // Bill is fixing an engine

http://jsfiddle.net/f0t0n/HHqEQ/

关于javascript - javascript中的继承模式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19515948/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com