gpt4 book ai didi

javascript - 在构造函数中使用 'this' 在 Object.defineProperty 中使用自执行函数构造新对象后的未定义属性

转载 作者:行者123 更新时间:2023-11-30 17:27:26 24 4
gpt4 key购买 nike

我正在尝试使用类似 TypeScript 的结构来模拟“值:”属性的自执行函数中的枚举。我检查了所有在构造函数中使用 ECMAScript5/Crockford Object.defineProperty() 的示例(使用'this')但找不到太多。据我所知,自执行函数应该用 10 个属性填充两个对象,并且闭包是正确的('this' 不是窗口对象)。这是我的设计模式:

var player = {};
var Foo = function () {
this.levelIndex;
Object.defineProperty(this, 'levelIndex', {
value: (function (levelIndex) {
levelIndex[levelIndex.ONE = 0] = 'ONE';
levelIndex[levelIndex.TWO = 1] = 'TWO';
levelIndex[levelIndex.THREE = 2] = 'THREE';
levelIndex[levelIndex.FOUR = 3] = 'FOUR';
levelIndex[levelIndex.FIVE = 4] = 'FIVE';
// setup the player object with the properties of the levelIndex
// before it becomes non-enumerable:
for (var i in levelIndex) {
Object.defineProperty(player, i, {
value: isNaN(levelIndex[i]) ? 'LEVEL_' + levelIndex[i] : levelIndex[i],
enumerable: false
});
alert(player[i]); //<-- LEVEL_ONE, LEVEL_TWO, LEVEL_THREE, LEVEL_FOUR, LEVEL_FIVE, 0, 1, 2, 3, 4
}
alert('window? : ' + this === window); //<-- false
})(this.levelIndex || (this.levelIndex = {})),
writable: false,
enumerable: false,
configurable: false
});
};
var foo = new Foo();
alert(player.ONE); //<-- 0
alert(foo.levelIndex); //<-- undefined
alert(foo.levelIndex.ONE); //<-- Uncaught TypeError: Cannot read property 'ONE' of undefined

为什么 foo.levelIndex 在这里未定义?

编辑:修复了 return levelIndex; 添加到匿名函数调用。

欢迎对我的设计模式提出任何意见或改进建议!

最佳答案

您使用普通函数调用来调用匿名函数,因此 this 的值将是 undefined在严格模式下,否则为全局对象(window)。它绝对不会是对您正在定义的对象文字的引用。

“Foo”函数的第一行看起来有点可疑:

    this.levelIndex;

这对任何事情都没有影响;具体来说,它不会导致在 this 引用的对象上创建名为“levelIndex”的属性。 .

编辑 — 此外,随着我​​对您所做工作的深入了解,很明显为什么“levelIndex”属性最终会变成 undefined。 :该对象文字具有一个“值”属性,该属性设置为该匿名函数调用的返回值。然而,匿名函数没有return。语句,所以调用 Object.defineProperty涉及“值”属性设置为 undefined 的属性对象.如果你添加

    return levelIndex;

到匿名函数的末尾,它(可能)起作用。 (我认为会。)

关于javascript - 在构造函数中使用 'this' 在 Object.defineProperty 中使用自执行函数构造新对象后的未定义属性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23937464/

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