var obj = {};
console.log(obj.constructor === Object); // true
console.log(typeof obj.constructor); // function
obj['foo'] = 'bar';
obj['constructor'] = 'String';
console.log(obj.constructor === Object); // false
console.log(typeof obj.constructor); // string

我想在此示例中提及一个案例:在obj
对象中,我添加了一个值为constructor
的新属性名称String
。值的类型为string
。
所以:'string' !== 'function'
。
由于我将它覆盖为第二个,我不能像第一个函数那样使用它。
这也意味着:一些js开发人员(几乎)不想在对象中声明名称为constructor
的属性。如果我尝试这样做,则会覆盖默认的constructor
。
与另一案件相同:
var array = [];
console.log(typeof array.forEach); // function
array['forEach'] = 'String';
console.log(typeof array.forEach); // string

为什么不接受具有相同名称但差异值类型的多个密钥?
我想要实现的目标:
var action = {
isDone: false,
isDone: function (flag) {
this.isDone = flag
}
};
action.isDone(progressing is done);
if (action.isDone) {
// done...
}
// 'boolean' !== 'function'
我的问题:
1 /.如何使用相同的键为对象定义新属性? (不与其他主题重复,因为same key but differnce value types
);
2 /.这是防止覆盖对象属性的最佳方法吗? (或readonly
作为标题)
var obj = {};
Object.defineProperty(obj, 'constructor', {
get: function () {
return function () {
// default constructor here...
}
},
set: function (newValue) {
// do nothing here...
}
})
答案 0 :(得分:1)
var obj = {
};
// being explicit
Object.defineProperty(obj, 'testFunction', {
writable: false,
value: function(){
console.log("Print read only Function");
return;
}
});
console.log(obj.testFunction.toString());
obj.testFunction();
obj.testFunction= function(){
console.log("Override Function");
}
console.log(obj.testFunction.toString());
obj.testFunction();

答案 1 :(得分:0)
如何使用相同的键为具有相同键的对象定义新属性? (不与其他主题重复,因为相同的键但是不同的值类型);
你不能
这是防止覆盖对象属性的最佳方法吗?
当然,但您仍然可能错误地使用它。无论你编写什么代码,它都可能是糟糕的JavaScript。
无论你来自哪种语言,我建议不要尝试在JavaScript中实现其他习语。 JavaScript是它自己的事情。了解如何编写惯用的JavaScript。