Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/384.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 将方法继承到除基本体以外的所有对象_Javascript_Inheritance_Prototype - Fatal编程技术网

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”,会发生什么到您的函数。。。