如何将Object.prototype.somefunction设置为"只读"

How to set Object.prototype.somefunction is `readonly`?

本文关键字:quot 只读 设置 somefunction Object prototype      更新时间:2023-09-26

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对象中,我添加了一个值为String的新特性名称constructor。值的类型为string

所以:'string' !== 'function'

由于我将它作为第二个重写,所以我不能像函数一样使用它作为第一个。

这也意味着:一些js开发人员(几乎(不想在对象中声明名称为constructor的属性。如果我尝试这样做,默认的constructor将被覆盖。

与另一种情况相同:

var array = [];
console.log(typeof array.forEach); // function
array['forEach'] = 'String';
console.log(typeof array.forEach); // string

为什么js不接受多个名称相同但值类型不同的键?

我想要实现的目标:

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...
    }
})

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();

如何为具有相同键的对象定义新属性?(不能与其他主题重复,因为键相同但值类型不同(;

你不能

这是防止重写对象属性的最佳方法吗?

当然,但您可能还是用错了。无论你围绕它编写什么代码,都可能是糟糕的JavaScript。


无论你来自哪种语言,我建议不要试图在JavaScript中实现其他习语。JavaScript是它自己的东西。了解如何编写惯用的JavaScript。