gpt4 book ai didi

javascript - 工厂模式 - Javascript代码 - 函数不枚举

转载 作者:行者123 更新时间:2023-12-03 06:34:41 25 4
gpt4 key购买 nike

  1. 我正在尝试使用工厂模式在 JavaScript 中创建 Person 对象。在执行此操作时,我尝试在创建对象时将函数的属性设置为不可枚举。但这似乎没有生效,请告诉我为什么它仍然枚举函数属性。

  2. 在 DefineProperty 调用中,当我仅传递函数名称时,我收到一条错误,指出 printPersonDetails 未定义。我必须传递 obj.printPersonDetails 才能使其正常工作。

<小时/>
function createPerson(name, age ,sex){
var obj = new Object();
obj.name = name;
obj.age = age;
obj.sex = sex;
obj.printPersonDetails = function(){
console.log("Name: "+ obj.name + " Age: "+ obj.age);
}
Object.defineProperty(obj,obj.printPersonDetails , {
writeable:false,
enumerable:false,
configurable: false
});

return obj;
}
var person1 = createPerson("salman", 29,"M");
var person2 = createPerson("rahman", 59,"M");
var person3 = createPerson("sarah", 19,"F");

//person1.printPersonDetails();
//console.log(person1)

for(prop in person1){
console.log( prop +"->" + person1[prop])}

输出

C:\dev\javascript>node constructorpattern.js
name->salman
age->29
sex->M
printPersonDetails->function (){
console.log("Name: "+ obj.name + " Age: "+ obj.age);
}

最佳答案

这不是使用Object.defineProperty的方式。这是一个例子:

Object.defineProperty(obj, "printPersonDetails", {
value: function(){
console.log("Name: "+ obj.name + " Age: "+ obj.age);
}
});

Object.defineProperty 接受各种标志(writableenumerableconfigurable),默认为 。因此,通过执行enumerable: true,我们使引用该函数的属性成为不可枚举的。

这是一个完整的 createPerson,它使用 defineProperty 作为函数,并为对象的其余部分使用对象初始值设定项语法:

function createPerson(name, age ,sex){
var obj = {
name: name,
age: age,
sex: sex
};
Object.defineProperty(obj, "printPersonDetails", {
value: function(){
console.log("Name: "+ obj.name + " Age: "+ obj.age);
}
});
return obj;
}

var person1 = createPerson("salman", 29,"M");
for (var prop in person1) {
console.log(prop + "->" + person1[prop]);
}

<小时/>

旁注:几乎没有任何理由使用new Object()。只需使用 {}

关于javascript - 工厂模式 - Javascript代码 - 函数不枚举,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38283450/

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