JavaScript函数模拟类,最佳实践?

10

我注意到可以编写像下面这样的函数来模拟类。 我想知道是否这是最新的方法。 欢迎任何评论。 谢谢

function Apple(type) {
    this.type = type;
    this.color = "red";
    this.getInfo = function () {
        return this.color + ' ' + this.type + ' apple';
    };
}

var apple = new Apple('testapple');
apple.color = 'blue';
console.log(apple.getInfo());

vbulletin论坛使用相同的东西。看一下 http://km-basicresearch.com/tnsatadmins/js/vbulletin_textedit.js 我认为没问题。 - unloco
请自己一个忙,使用CoffeeScript吧...它更容易编写面向对象的代码。您可以在CoffeeScript中编写代码,然后将其编译为JavaScript,以便与其他JS文件共存。了解更多信息,请访问http://coffeescript.org。 - Pooria Azimi
2个回答

10

你的代码可以运行,但效率不够高,因为它会给每个实例都赋予一个 getInfo 函数。这是可以避免的。你可以使用以下模式来模拟JS中的类。

基础模式

要模拟类属性/方法,请在构造函数上设置属性/方法。

function Apple() {};
Apple.classProperty = some_value;
Apple.classMethod = some_method;

为了模拟实例属性,你可以在构造函数内设置(就像你在代码中所做的):

function Apple() {
  this.property = some_instance_value;
};
为了模拟一个实例方法,你可以在构造函数的`Constructor.prototype`中设置函数,这些函数将在其所有实例之间共享。
function Apple() {};
Apple.prototype.instanceMethod = function () {...};

高级模式

如果您想设置私有/特权方法,Crockford提供了非常有用的模式。

私有方法-仅对构造函数可用:

function Constructor(...) {
var that = this;
var membername = value;
function membername(...) {...}

}

特权方法 - 可以访问私有方法并对公众可用:

function Constructor(...) {
this.membername = function (...) {...};
}

感谢您详细的回答。我不明白每个实例都获得该方法有什么问题,能否详细说明一下? - Johan
1
JS会为每个实例方法分配更多的内存空间,如果你频繁使用这些实例方法,将会对性能产生很大影响。 - steveyang
非常感谢您提供的精彩总结。遗憾的是,即使是IE 11,仍然不支持现代ECMAScript类。 - AFract

0

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接