gpt4 book ai didi

javascript - 尝试在 Javascript (ES5) 中实现 OPP 继承的简单方法

转载 作者:搜寻专家 更新时间:2023-11-01 04:15:28 26 4
gpt4 key购买 nike

出于好奇,我正在研究 Javascript 中的原型(prototype)继承和 OOP 继承。大多数结果涉及使用函数模拟“类”和“扩展”概念,而其他结果则使用原型(prototype)和构造函数。

我写了这段代码:

function Warrior(weaponName) {
var weapon = weaponName;
this.getWeapon = function() {
return weapon;
};
this.setWeapon = function(value) {
weapon = value;
};
this.displayInfo = function() {
return {
"weapon": this.getWeapon(),
};
};
}

function Archer() {
var accuracy = "86%";
this.parent = Archer.prototype; // Inheritance workaround
this.getAccuracy = function() {
return accuracy;
};
this.setAccuracy = function(value) {
accuracy = value;
};
this.displayInfo = function() {
var form = this.parent.displayInfo();
form.accuracy = this.getAccuracy();
return form;
};
}
Archer.prototype = new Warrior("bow");
var w = new Warrior("sword");
var a = new Archer();
console.log(w.displayInfo());
console.log(a.displayInfo());

我这样做是为了在显示 Warrior 类的信息时,将对象显示为

{ weapon: "sword" }

当显示来自 Archer 的信息时,对象是:

{ weapon: "sword", accuracy: "86%" }

“子类”从“父类(super class)”获取信息并添加到其中。从 Archer 调用“getWeapon()”或“setWeapon”也可以。即使我添加了扩展“Archer”并拥有自己的属性的三级“Kyudoka”,链条也没有问题。

但与我在研究过程中发现的更复杂的代码相比,我觉得这可能是一个幼稚的实现(“继承解决方法”行)并且我遗漏了一些东西(考虑到 JS 有很多微妙之处)。

这是一个理论问题,我没有在任何系统中使用此代码。

最佳答案

根据 Javascript the Good Parts 一书,javascript 中主要有 3 种继承:PseudoclassicalPrototypal功能性

您刚刚发布的那个属于Pseudoclassical 继承,您可以在其中使用构造函数模拟类行为。

我发现 Functional 模式更有用和灵活,它允许您保护您的变量(将它们设为私有(private))。

var constructor = function (spec, my) {
var that, other private instance variables;
my = my || {};
//Add shared variables and functions to my
that = a new object;
//Add privileged methods to that
return that;
}

Prototypal 基本上是让您的对象直接从其他有用的对象继承,这类似于将它们(有用的对象)作为您的新对象构造函数原型(prototype)。

Object.beget = function (o) {
var F = function () {};
F.prototype = o;
return new F();
};

var a = {}
//Add shared variables to a
var b = Object.beget(a);
//Add new methods to b

每个模式都有很多考虑因素,例如 Crockford 在他的书中说 “功能模式具有很大的灵 active 。它比伪经典模式需要更少的努力,并为我们提供了更好的封装和信息隐藏以及对 super 方法的访问。”,但我也看到过相反观点的文章,例如 http://bolinfest.com/javascript/inheritance.php

编辑 ------

如果您可能想了解访问 super 方法的不同方法,在Functional 模式中您可以执行以下操作:

Function.prototype.method = function (name, func) {
this.prototype[name] = func;
return this;
};

Object.method('superior', function (name) {
var that = this,
method = that[name];
return function ( ) {
return method.apply(that, arguments);
};
});

var archer = function (spec, accuracy) {
var that = warrior(spec),
super_displayInfo = that.superior('displayInfo');
that.getAccuracy = function() {
return accuracy;
};
that.setAccuracy = function(value) {
accuracy = value;
};
that.displayInfo = function (n) {
var form = super_displayInfo()
form.accuracy = that.getAccuracy();
return form;
};
return that;
};

关于javascript - 尝试在 Javascript (ES5) 中实现 OPP 继承的简单方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32257728/

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