gpt4 book ai didi

javascript - OO Javascript 构造函数模式 : neo-classical vs prototypal

转载 作者:IT王子 更新时间:2023-10-29 03:06:21 25 4
gpt4 key购买 nike

我看了a talk by Douglas Crockford on the good parts in Javascript和我的眼睛被打开。有一次他说,“Javascript 是唯一一种优秀的程序员认为他们可以有效使用它而无需学习的语言。”然后我意识到,我就是那个人。

在那次演讲中,他发表了一些对我来说非常令人惊讶和有见地的陈述。例如,JavaScript 是地球上最重要的编程语言。或者它是地球上最流行的语言。而且,它以许多严重的方式被破坏。

对我来说,他最令人惊讶的一句话是“新的是危险的”。他不再使用它了。他也不使用this

他为 Javascript 中的构造函数提出了一个有趣的模式,该模式允许私有(private)和公共(public)成员变量,并且既不依赖于 new 也不依赖于 this。它看起来像这样:

// neo-classical constructor
var container = function(initialParam) {
var instance = {}; // empty object

// private members
var privateField_Value = 0;
var privateField_Name = "default";

var privateMethod_M1 = function (a,b,c) {
// arbitrary
};

// initialParam is optional
if (typeof initialParam !== "undefined") {
privateField_Name= initialParam;
}

// public members
instance.publicMethod = function(a, b, c) {
// because of closures,
// can call private methods or
// access private fields here.
};

instance.setValue = function(v) {
privateField_Value = v;
};

instance.toString = function(){
return "container(v='" + privateField_Value + "', n='" + privateField_Name + "')";
};

return instance;
}


// usage
var a = container("Wallaby");
WScript.echo(a.toString());
a.setValue(42);
WScript.echo(a.toString());

var b = container();
WScript.echo(b.toString());

编辑:更新代码以切换到小写类名。

这个模式是从Crockford's earlier usage models演变而来的.

问题:您使用这种构造函数模式吗?你觉得可以理解吗?你有更好的吗?

最佳答案

这看起来像是 module pattern 的非单例版本,从而可以通过利用 JavaScript 的“闭包”来模拟私有(private)变量。

我喜欢它(有点……)。但我并没有真正看到以这种方式处理私有(private)变量的优势,尤其是当这意味着添加的任何新方法(在初始化之后)都无法访问私有(private)变量时。

另外,它没有利用 JavaScript 的原型(prototype)模型。每次调用构造函数时都必须初始化所有方法和属性——如果您将方法存储在构造函数的原型(prototype)中,则不会发生这种情况。事实上,使用传统的构造函数/原型(prototype)模式要快得多!您真的认为私有(private)变量值得性能损失吗?

这种模型对模块模式有意义,因为它只被初始化一次(以创建一个伪单例),但我不太确定它在这里是否有意义。

Do you use this kind of constructor pattern?

不,虽然我确实使用它的单例变体,但模块模式...

Do you find it understandable?

是的,它是可读的并且非常清晰,但我不喜欢将所有内容都集中在这样的构造函数中的想法。

Do you have a better one?

如果你真的需要私有(private)变量,那么一定要坚持使用它。否则,只需使用传统的构造函数/原型(prototype)模式(除非你和 Crockford 一样害怕 new/this 组合):

function Constructor(foo) {
this.foo = foo;
// ...
}

Constructor.prototype.method = function() { };

其他与 Doug 对该主题的看法相关的类似问题:

关于javascript - OO Javascript 构造函数模式 : neo-classical vs prototypal,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1809914/

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