gpt4 book ai didi

javascript - 为什么不对对象属性使用闭包?

转载 作者:数据小太阳 更新时间:2023-10-29 03:50:10 24 4
gpt4 key购买 nike

我目前正在用 javascript 编写对象,我希望使用最佳实践等以一种清晰、漂亮的方式来完成它。但我很烦恼我必须始终将 this. 写到地址属性,与其他 OO 语言不同。

所以我想到了 - 为什么不对对象属性使用闭包?看看我的示例对象。所以不是这样,经典的方式:

var MyObjConstructor = function (a, b) {

// constructor - initialization of object attributes
this.a = a;
this.b = b;
this.var1 = 0;
this.var2 = "hello";
this.var3 = [1, 2, 3];

// methods
this.method1 = function () {
return this.var3[this.var1] + this.var2;
// terrible - I must always write "this." ...
};

}

...我会使用闭包来做到这一点,这样我就不需要每次都编写this.来访问属性了!

var MyObjConstructor = function (a, b) {

// constructor - initialization of object attributes
// the attributes are in the closure!!!
var a = a;
var b = b;
var var1 = 0;
var var2 = "hello";
var var3 = [1, 2, 3];

// methods
this.method1 = function () {
return var3[var1] + var2;
// nice and short
};

// I can also have "get" and "set" methods:
this.getVar1 = function () { return var1; }
this.setVar1 = function (value) { var1 = value; }
}

此外,它还有一个隐藏的好处,即除了通过 get/set 方法之外,实际上无法通过任何其他方式访问属性!!

那么问题是:

  1. 这是个好主意吗?它“干净”吗,是否符合最佳实践?
  2. 这两个解决方案之间是否存在任何其他语义差异?
  3. 像这样使用闭包有什么陷阱吗?

最佳答案

95% 的性能下降。

实际Benchmark所以对于你的(简单的)例子来说,跨浏览器性能下降 50%-85%。

说真的,关闭速度非常慢。

现在对数据使用闭包不是问题,但对函数/方法使用闭包才是问题。你不能没有另一个。存在于原型(prototype)上的方法没有访问存在于构造函数内的局部变量的机制。

另一个问题是您的“经典”示例没有使用原型(prototype):\

你真正想要的是

所以下面的也是不好的

var MyObjConstructor = function (a, b) {

// constructor - initialization of object attributes
this.a = a;
this.b = b;
this.var1 = 0;
this.var2 = "hello";
this.var3 = [1, 2, 3];

// methods
this.method1 = function () {
return this.var3[this.var1] + this.var2;
};

}

你想要

// constructor - initialization of object attributes
var MyObjConstructor = function (a, b) {
this.a = a;
this.b = b;
}

Object.extend(MyObjConstructor.prototype, {
var1: 0,
var2: "hello",
var3: [1, 2, 3],
// methods
method1: function () {
return this.var3[this.var1] + this.var2;
}
});

对于 Object.extend 的某个值.这里是在原型(prototype)上放置任何通用数据或方法,并在所有 实例之间共享该数据。这样我们就不会每次都在内存复制所有内容。

// terrible - I must always write "this." ...

另一种方法是为每个对象复制状态。闭包模式很好,但性能不佳。

关于javascript - 为什么不对对象属性使用闭包?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7835048/

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