【问题标题】:(Javascript) Override object built-in or inherited properties?(Javascript)覆盖对象内置或继承属性?
【发布时间】:2013-11-24 14:39:54
【问题描述】:

使用 Javascript 对象,哪些属性覆盖是有效的并且应该在任何浏览器中工作

// Dot notation overrides
var obj1 = {};
obj1.hasOwnProperty = 123;
obj1.constructor = 'Oh! I am not a constructor';

console.log(obj1.hasOwnProperty); // 123
console.log(obj1.constructor);    // => 'Oh! I am not a constructor'

// Braces notation overrides
var obj2 = {};
obj2['hasOwnProperty'] = 123;
obj2['constructor'] = 'Oh! I am not a constructor';

console.log(obj2['hasOwnProperty']); // 123
console.log(obj2['constructor']);    // => 'Oh! I am not a constructor'

在 Firefox 和 Chrome 中,所有这些都可以正常工作,但这是正常的吗?我可以放心地依赖它吗?

如果是,是否有任何对象属性无法以这种方式覆盖?

附:我不是在说“覆盖hasOwnProperty 是不安全的,因为有人可以调用你的对象的hasOwnProperty”。 我只是说这些覆盖是否应该起作用

【问题讨论】:

  • 你说的是宿主对象还是原生对象?
  • @David Native 对象,我想。仅使用花括号创建:obj = {};

标签: javascript object inheritance


【解决方案1】:

是的,这些都是完全有效的。实际上,点和括号表示法的作用完全相同,因此没有理由比较它们。

如果你真的很担心,你可以这样做,但没有必要:

var obj = Object.create(null);
console.log(obj.hasOwnProperty); // undefined
console.log(obj.constructor); // undefined

【讨论】:

  • 感谢您打消了我的疑虑! (有起始声望,我不能投票。)
  • @ThyBzi 不客气!您仍然可以通过单击左侧的绿色复选标记来接受答案。欢迎来到堆栈溢出! :)