gpt4 book ai didi

javascript - 在这种情况下在 JavaScript 中实现继承 [更具体地说是 node.js]

转载 作者:行者123 更新时间:2023-11-30 10:26:38 25 4
gpt4 key购买 nike

I understand that it is looked down upon posting questions about a programming language however I really can't seem to wrap my head around this one and it is really demoralizing me.

我正在用 node js 编写一个游戏,我想从这个类继承......我不确定,语法让我失望,这个东西的教程似乎有上千种不同的方式我的方法,带有构造函数和所有内容。

基本上我的问题是如何继承下面的代码。

/* Character class*/
var character = function(startX) {
var x = startX,
swipe = 0;

var getX = function() {
return x;
};

var getSwipe = function(){
return swipe;
};

var setX = function(newX) {
x = newX;
};

var setSwipe = function(newSwipe){
swipe = newSwipe;
};

return {
getX: getX,
getSwipe: getSwipe,
setX: setX,
setSwipe: setSwipe
};

}

exports.Character= Character;

最佳答案

使用以这种形式编写的代码(您没有使用 new 并且您拥有真正私有(private)的数据),主要的障碍是 Character 不有任何可以在实例之间共享的东西。因此,虽然您可以将 Character 生成的对象用作其他对象的原型(prototype),但您不能将一个 Character 对象重用为多个派生对象的原型(prototype)。

下面是如何编写一个函数(比如 Villian)来生成对象,每个对象都有自己的底层 Character 对象作为原型(prototype):

function Villian(startX) {
var rv = Object.create(Character(startX));

rv.doEvilThing = function() {
};

return rv;
}

Villian 创建一个新的 Character 对象并将其指定为 Villian 创建的对象的原型(prototype)。当然,这意味着每次调用 Villian 都会创建两个对象,而不是仅仅一个对象,如果 Character 的某些部分我们可以在 Villian 之间重用s.

你可以让 Villian 直接从 Character 扩展对象:

function Villian(startX) {
var rv = Character(startX);

rv.doEvilThing = function() {
};

return rv;
}

这只会创建一个对象,并且在 VillianCharacter 方面没有区别。


如果 Character 是这样写的,因为你希望 xswipe 是真正私有(private)的(尽管两者都有 setter 和 setter/getter ,我没有看到太多的理由),你可能想要使用将成为 ES6 的基础的模式 private properties ,与您当前使用的模式不同,它对共享原型(prototype)对象友好。

我已经 written an article了解如何在不等待新的 ES6 功能的情况下几乎可以做到这一点。简而言之:ES6 将引入新的“Name”对象,这些对象不是字符串,但可以用作属性的名称。引用属性时可以使用该对象代替名称。例如:

var x = new Name(); // Create the private name object
this[x] = value; // Put a property on the object with that name

私有(private) Name 对象是不透明的,默认情况下使用它们创建的属性是不可枚举的。

这是整体模式。 (我在这里尝试坚持您的编码风格,对变化表示歉意。)请注意,这些 CharacterVillian 要求您使用 new它们,与上面的 Character 不同。下面我展示了如何在没有 new 的情况下执行此操作(这是一个小改动)。

var Character = (function() {
var x = new Name(); // The *name* for our `x` property
var swipe = new Name(); // The *name* for our `swipe` property

/* Character class*/
var Character = function(startX) {

this[x] = startX;
this[swipe] = 0;
};

Character.prototype.getX = function() {
return this[x];
};

Character.prototype.getSwipe = function(){
return this[swipe];
};

// ...etc...

return Character;

})();

var Villian = (function() {

/* Villian class*/
var Villian = function(startX) {
Character.call(this, startX);
};
Villian.prototype = Object.create(Character.prototype);

Villian.prototype.doEvilThing = function() {
// ...
};

return Villian;

})();

请注意,我们现在在原型(prototype)上有各种方法,属性确实是属性(而对于您使用的模式,它们是私有(private)的,而不是属性),但是由于我们的作用域函数之外的代码无法访问Name 对象,没有外部代码可以使用这些属性。

在 ES5 和更早版本(例如今天)上,您需要一个函数来代表 ES6 的 Name。我在文章中给出的只是使用非重复的随机字符串:

var Name = function() {
var used = {};

function Name() {
var length, str;

do {
length = 5 + Math.floor(Math.random() * 10);
str = "_";
while (length--) {
str += String.fromCharCode(32 + Math.floor(95 * Math.random()));
}
}
while (used[str]);
used[str] = true;
return new String(str); // Since this is called via `new`, we have to return an object to override the default
}

return Name;
}();

你可以在没有 new 的情况下做同样的事情。唯一改变的是实际的 CharacterVillian 函数,但为了清楚起见,我将包含整个内容:

var Character = (function() {
var x = new Name(); // The *name* for our `x` property
var swipe = new Name(); // The *name* for our `swipe` property

/* Character class without using `new` */
var Character = function(startX) {
var c = Object.create(Character.prototype);
c[x] = startX;
c[swipe] = 0;
return c;
};

Character.prototype.getX = function() {
return this[x];
};

Character.prototype.getSwipe = function(){
return this[swipe];
};

// ...etc...

return Character;

})();

var Villian = (function() {

/* Villian class without using `new` */
var Villian = function(startX) {
var v = Object.create(Villian.prototype);
Character.call(v, startX);
return v;
};
Villian.prototype = Object.create(Character.prototype);

Villian.prototype.doEvilThing = function() {
// ...
};

return Villian;

})();

关于javascript - 在这种情况下在 JavaScript 中实现继承 [更具体地说是 node.js],我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19288038/

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