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

时间:2016-08-04 09:24:55

标签: javascript object override



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

2 个答案:

答案 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。