如何设置 Object.prototype.somefunction 为 `readonly`?

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

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

为什么js不接受多个同名不同值类型的key?

我想达到的目标:

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

How to define new property to an object with same key? (not duplicate with another topics because same key but differnce value types);

你不能

Is it the best way to prevent to override an object property?

当然,但您仍然可能使用错误。你围绕它编写的任何代码都可能是错误的 JavaScript.


无论您来自哪种语言,我建议不要尝试在 JavaScript 中实现其他习语。 JavaScript是它自己的东西。学习如何写地道的 JavaScript.

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