仅为{...}对象定义原型

Dom*_*nik 5 javascript prototype key object

是否可以仅为{} -Objects定义原型?

在Javascript中,几乎所有东西都是一个对象.

Object.prototype.test = function() {
    alert("test");
}
Run Code Online (Sandbox Code Playgroud)

所有对象(包括Number,String和Array)都将具有此方法.但我只想要这个结构对象.> {...} <

您可以先为对象创建所有原型,然后从Number,String和Array等其他对象中删除它.

// Overwrite
Array.prototype.test = undefined; // or delete property
Run Code Online (Sandbox Code Playgroud)

这"工作"......原型被覆盖.但关键仍然存在.

// Show all keys
for (key in arr)
{
    alert(key); // print index of array AND keynames
}
Run Code Online (Sandbox Code Playgroud)

我正在寻找最优雅的方式来做到这一点.

And*_*Evt 0

使用Array.prototype.test = undefined;您的方法值设置为undefinied,这不会删除它。

如果您确实想删除方法(属性),请使用delete Array.prototype.test;

ps 但在这种情况下(使用{}对象)-> 你无法得到你想要的东西delete

Array.prototype继承自Object.prototype,删除后Array.prototype.test您的代码将找到Object.prototype.test并调用它。

我认为制作你想要的东西的最好方法是制作这样的东西:

Object.defineProperty(Object.prototype, 'test', {
  enumerable: false,
  configurable: false,
  writable: true,
  value: function(test) { alert('In test' + test); }
});

Object.defineProperty(Array.prototype, 'test', {
  enumerable: false,
  configurable: false,
  writable: false,
  value: function() { throw new Error('You can\'t do it!'); }
});

try {
    var a = [];
    var keys = "";

    for (key in a) {
        keys += key + ', '; // get all keys
    }
    // call array test method -> will throw exception
    a.test('from array');

} catch (e) {
    // check keys -> test is not here
    console.log("Error: " + e.message + ' ' + "KEYS: " + keys);
}

var b = {};
// and this will work
b.test('from object');
Run Code Online (Sandbox Code Playgroud)

  • 这不会阻止在“Array”上调用“test”。原型链将在“Object”原型上找到“test”函数并调用它:http://jsfiddle.net/x2wysox8/ (2认同)