【问题标题】:get type of object under prototype function获取原型函数下的对象类型
【发布时间】:2023-03-18 04:00:01
【问题描述】:

有人知道如何在原型属性下获取 typeof 对象吗?即我有下一个代码:

Object.prototype.someproperty = function(){
...do something...
console.log(typeof this); 
..more...
}

在我的代码中,这总是“函数”,因为对象的构造函数是一个函数。当我这样打电话时

Array.someproperty(); //In this i want get "array"
//or
String.someproperty(); //In this i want get "string"

我想得到“数组”而不是“函数”……有人知道怎么做吗?

【问题讨论】:

  • typeof [] 将始终返回“object”,因为所有数组都是对象(在 JavaScript 中)。检查数组的更好方法是 -- Object.prototype.toString.call(yourVariableHere) === '[object Array]'
  • 我已经用这样的简单“名称”解决了我的问题。 Object.prototype.myfn= function(){ return this.name; } String.myfn(); //返回“字符串” Array.myfn(); //返回“数组” Function.myfn(); //返回“函数” Object.myfn(); //返回“对象” Number.myfn(); //return "Number" 我把 "someproperty" 改成 "myfn" 受到争​​议。谢谢大家。
  • 呃,再一次,您只是将myfn 应用于函数!如果这是您的意图,您应该扩展Function.prototype 而不是Object.prototype。这有非常真实的原因。此外,如果您需要完整的浏览器支持,函数上的.name 是非标准属性,在某些浏览器中不起作用。

标签: javascript object typeof prototype-programming


【解决方案1】:

这里的问题是 this 在通过 ArrayString 调用时绑定到函数而不是类型的实例。我知道确定正在调用哪些函数的唯一方法是进行如下手动测试

Object.prototype.someproperty = function() {
  if (this === Array) {
    return "array";
  } else if (this === String) {
    return "string";
  } 
  ...
}

在这种情况下,尽管您实际上并未报告从中调用原型的对象的类型。值“函数”对此非常准确。这更像是一种启发式而不是真正的类型测试

【讨论】:

  • 如果这是 OP 真正想要做的,那么扩展 Function.prototype 将是一种改进。
  • @Ӫ_._Ӫ 可能。我不是 100% 确定 OP 的意图是什么。我最初的反应是,他们想要一个适用于所有实例的函数,但随后对为什么在 ArrayString 构造函数上使用失败感到困惑。如果是这种情况,那么Object 上的扩展名就更有意义了。总体而言,尽管这种类型的测试充其量似乎注定是片状的
  • 是的,这很令人困惑,特别是因为该方法被命名为someproperty。但无论哪种方式,IMO Object.prototype 扩展(无论如何都是可枚举的)很少有意义。但是,如果这就是 OP 想要的,那么这就是 OP 得到的。 ;)
  • 是的,我想扩展所有对象;具有通用函数的字符串、数组、函数,用于扩展所有类型。示例:Array.mynewextendfn('nameoffn',function(){}); 并将nameoffn 添加到registre 数组中。是如此罕见,但对我的项目很重要。谢谢
  • 终于在这段时间里,通过大量的阅读和学习,我发现扩展原型对象是非常糟糕的做法。感谢大家的支持。
【解决方案2】:

最后,通过大量阅读和学习,我发现扩展原型对象是非常糟糕的做法。谢谢大家的支持。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-08-12
    • 2019-01-12
    • 1970-01-01
    • 2016-04-14
    • 2020-10-15
    • 2018-02-18
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多