【问题标题】:Creating a custom object literal创建自定义对象字面量
【发布时间】:2015-11-15 20:47:32
【问题描述】:

我正在寻找一种方法来创建自定义 Object() 对象。我想要一种方法来检查给定对象的实例。我需要一种方法来区分自定义对象和原生对象。

function CustomObj (data) {
  if (data) return data
  return {}
}
CustomObj.prototype = Object.prototype

var custom = new CustomObj()
var content = new CustomObj({'hello', 'world'})
var normal = new Object()

console.log(custom) // => {}
console.log(content) // => {'hello', 'world'}
console.log(custom instanceof CustomObj) // => true (expected: true)
console.log(content instanceof CustomObj) // => true (expected: true)
console.log(custom instanceof Object) // => true (expected: false)
console.log(content instanceof Object) // => true (expected: false)
console.log(normal instanceof CustomObj) // => true (expected: false)
console.log(normal instanceof Object) // => true (expected: true)

我假设这是因为我从 Object 继承了 prototypes。我尝试添加一个this.name,但它并没有改变instanceof

【问题讨论】:

  • “我尝试添加this.name 那么,您向对象添加了name 属性,您希望更改什么?
  • @blex 我预计custom.constructor.name 会发生变化,并且instanceOf 会使用该名称来检测对象是instanceOf
  • JavaScript 中的对象总是要继承自 Object。
  • @Adam 好的,这如何帮助我实现我想要做的事情?
  • @Adam - Object.create(null)

标签: javascript object prototype instance


【解决方案1】:
function Custom (literal) {
  if (literal) return literal
  return {}
}
Custom.prototype = Object.prototype
Custom.prototype.constructor = Custom

var foo = new Custom()

if (foo.constructor.name === 'Custom') {
  // foo is a custom object literal
}

// However it registers as an instance of both `Custom` and `Object`
console.log(foo instanceof Custom) // => true
console.log(foo instanceof Object) // => true
console.log({} instanceof Custom) // => true
console.log({} instanceof Object) // => true

【讨论】:

    【解决方案2】:

    这个答案是错误的。我把它放在这里是因为 cmets 可能有助于理解这个问题。

    你的所有表达式都为真的原因是instanceof 在左侧的实例原型链中搜索右侧构造函数的原型(“类型”)。 Object 的原型和 CustomObj 的原型是相同的,因此表达式在所有情况下都为 true

    【讨论】:

    • 我实际上认为这是因为我返回了一个通用对象,它是一个instanceof 对象。所有这些信息都很好,但这不是答案:)
    • @ThomasReggi - 恕我直言,我的回答解释了为什么您的表达式评估为真。它基于事实,而不是假设。这就是instancrof 的定义方式。这是否满足您的答案,这完全是您的决定,我只希望这个答案可以帮助您理解。正如您在对问题的评论中所写,独立于您的用例,您想了解问题......
    • 我是说我认为这个答案是对正在发生的事情的错误描述,它与原型无关。 CustomObj 的返回值是一个通用对象 {},它是 Object 的一个实例。这就是为什么instanceOf 是假的。
    • @ThomasReggi - 明白了。你说得对。我没有注意到这部分。我想你现在可以搁置这个问题(要么发布你自己的答案,要么完全删除它)
    • 我不相信我已经得到了这个问题的答案,你是否暗示无法创建自定义通用对象?
    【解决方案3】:

    我相信这可以满足您的要求。请注意,原型的属性需要使用此解决方案在构造函数中定义,因为原型将被覆盖。

    function CustomObj (data) {
      CustomObj.prototype = Object.create(null)
      CustomObj.prototype.x = "Hello world!"
    
      return Object.create(CustomObj.prototype)
    }
    
    var custom = new CustomObj()
    var normal = new Object()
    
    console.log(custom.x); // => "Hello world!" (expected: "Hello world!")
    console.log(custom instanceof CustomObj) // => true (expected: true)
    console.log(custom instanceof Object) // => false (expected: false)
    console.log(normal instanceof CustomObj) // => false (expected: false)
    console.log(normal instanceof Object) // => true (expected: true)
    

    【讨论】:

    • 非常感谢。但是,它不能满足一个主要要求,那就是datacustomObject 的返回值。无论是否将某些内容传递给CustomObj
    • 1.你没有对data 做任何事情,为什么它在那里? 2. 在每次调用时重新定义CustomObj.prototype 是没有意义的。只做一次,而不是在函数内部。 3.构造函数的返回值在用于构造对象时被忽略(new ...)。 4. 你不再有标准的对象方法。 5. 我看到你对Object的继承改变了主意。
    • 我正在考虑这个,就像我想创建一个自定义对象对象一样。对象获取数据。 new Object({'hello': 'world'})new Object(),并返回数据。
    • @Amit 1. 不知道数据是什么,我想它的属性可以在构造函数中复制到 CustomObj 的原型上。 2.请发布您的解决方案。 3. 那么为什么去掉return语句会产生不同的结果呢? 4. 为什么需要它们?请举个例子。 5. 我做到了。感谢您分享您的知识。
    • @Amit A constructor function's return value is ignored 仅当返回值不是对象时才为真。
    猜你喜欢
    • 1970-01-01
    • 2018-04-19
    • 2012-03-01
    • 2018-09-07
    • 1970-01-01
    • 2016-01-26
    • 2010-09-18
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多