Javascript 将方法继承到除基本体以外的所有对象
我想添加一个能够处理所有对象的方法。它最好不存在于它不能工作的原语(数字、布尔值、字符串、符号)上 这可能吗?如果可能,如何实现Javascript 将方法继承到除基本体以外的所有对象,javascript,inheritance,prototype,Javascript,Inheritance,Prototype,我想添加一个能够处理所有对象的方法。它最好不存在于它不能工作的原语(数字、布尔值、字符串、符号)上 这可能吗?如果可能,如何实现 使用Object.prototype不起作用,因为基元类型继承自Object。您可以在对象的原型上设置函数,然后在构造函数的原型上设置相应的成员,您不希望它未定义的: Object.prototype.foo = function() { alert("foo"); }; Number.prototype.foo = undefined; var x = {}; va
使用Object.prototype不起作用,因为基元类型继承自Object。您可以在
对象的原型上设置函数,然后在构造函数的原型上设置相应的成员,您不希望它未定义的:
Object.prototype.foo = function() { alert("foo"); };
Number.prototype.foo = undefined;
var x = {};
var y = 10;
x.foo(); // works
y.foo(); // TypeError: y.foo is not a function
我不知道你为什么要这样做,这看起来像是一种代码味道,但你可以这样做。你可以在对象的原型上设置函数,然后在构造函数的原型上设置相应的成员,你不希望它未定义的:
Object.prototype.foo = function() { alert("foo"); };
Number.prototype.foo = undefined;
var x = {};
var y = 10;
x.foo(); // works
y.foo(); // TypeError: y.foo is not a function
我不知道你为什么要这样做,这看起来像是一种代码味道,但这就是问题所在。原语不是对象,也不会从任何地方继承。它们可以包装在继承自Object.prototype
的对象中,但这些都是对象
它可能看起来像是原语继承属性,但在后台,这些属性是通过对象包装器而不是原语访问的。解析属性引用时
- 如果(V)为真,则
- :在这种情况下,base永远不会为null或未定义
- 让base成为(base)
- 返回基。[[Get]]((V)、(V))
因此,如果引用的基础是基元,则在尝试获取属性之前,它将被转换为对象
但正如@nnnnnn所指出的,当您使用时,this
值将是原语,因为引用的基数没有改变。注意:在草率模式下,它将被强制为对象
事实上,如果您想在调用方法时防止原语被用作引用的基础,您可以利用这一点并测试this
值:
Object.prototype.method = function() {
"use strict";
if(Object(this) !== this) {
throw Error('This method can only be called on objects');
}
// ...
return "works";
};
true.method(); // Error: This method can only be called on objects
new Boolean(true).method(); // "works"
基本体不是对象,也不会从任何地方继承。它们可以包装在继承自Object.prototype
的对象中,但这些都是对象
它可能看起来像是原语继承属性,但在后台,这些属性是通过对象包装器而不是原语访问的。解析属性引用时
- 如果(V)为真,则
- :在这种情况下,base永远不会为null或未定义
- 让base成为(base)
- 返回基。[[Get]]((V)、(V))
因此,如果引用的基础是基元,则在尝试获取属性之前,它将被转换为对象
但正如@nnnnnn所指出的,当您使用时,this
值将是原语,因为引用的基数没有改变。注意:在草率模式下,它将被强制为对象
事实上,如果您想在调用方法时防止原语被用作引用的基础,您可以利用这一点并测试this
值:
Object.prototype.method = function() {
"use strict";
if(Object(this) !== this) {
throw Error('This method can only be called on objects');
}
// ...
return "works";
};
true.method(); // Error: This method can only be called on objects
new Boolean(true).method(); // "works"
简化了从原语中删除方法的方法
Object.prototype.test = function() { }
for(let { prototype } of [ String, Number, Boolean, Symbol ]) {
prototype.test = undefined
}
简化了从原语中删除方法的方法
Object.prototype.test = function() { }
for(let { prototype } of [ String, Number, Boolean, Symbol ]) {
prototype.test = undefined
}
定义“工作”。你的意思是在JS中每个对象的原型中出现的函数吗?@AsadSaeeduddin添加了一个属性,该属性在原型上不起作用;true.test==1@DanielHerr似乎您误解了代码中发生的事情。是对象包装器继承了test
属性,而不是true
。定义“工作”。你的意思是在JS中每个对象的原型中出现的函数吗?@AsadSaeeduddin添加了一个属性,该属性在原型上不起作用;true.test==1@DanielHerr似乎您误解了代码中发生的事情。是对象包装器继承了test
属性,而不是true
。我理解您所做的区别,但是…即使是您自己的示例true.self()
也表明您可以从object.prototype
直接调用方法。(我说“直接”的意思是,在代码中,你没有显式地转换或包装任何东西,它只是“工作”。)另外,想想如果你添加“use strict”,会发生什么代码>到您的函数…我理解您所做的区别,但是…即使是您自己的示例true.self()
也表明您可以从Object.prototype
直接调用该方法。(我说“直接”的意思是,在代码中,你没有显式地转换或包装任何东西,它只是“工作”。)另外,想想如果你添加“use strict”,会发生什么代码>到您的函数。。。