Javascript 创建自定义对象文字

Javascript 创建自定义对象文字,javascript,object,prototype,instance,Javascript,Object,Prototype,Instance,我正在寻找一种创建自定义Object()对象的方法。我想要一种方法来检查给定对象是什么的实例。我需要一种区分自定义对象和本机对象的方法 function CustomObj (data) { if (data) return data return {} } CustomObj.prototype = Object.prototype var custom = new CustomObj() var content = new CustomObj({'hello', 'world'})

我正在寻找一种创建自定义
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)

我假设这是因为我从
对象
继承了
原型
。我尝试添加一个
this.name
,但它没有改变
实例的

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

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)

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

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)
这个答案是错误的。我把它放在这里是因为这些评论可能有助于理解这个问题

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

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



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

“我尝试添加一个
this.name
”因此,您向对象添加了一个
name
属性,您希望更改什么?@blex我希望
custom.constructor.name
会更改,
instanceOf
会使用该名称检测对象是什么
instanceOf
。JavaScript中的对象总是从对象继承。@Adam Ok,这是如何帮助我实现我的目标的?@Adam-
Object.create(null)
“我尝试添加一个
this.name
”因此,您向对象添加了一个
name
属性,您希望更改什么?@blex我希望
custom.constructor.name
会更改,
instanceOf
会使用该名称检测对象是什么
instanceOf
。JavaScript中的对象总是从对象继承。@Adam Ok,这是如何帮助我实现我的目标的?@Adam-
Object.create(null)
非常感谢。但是,它不能满足一个主要要求,
数据
自定义对象
的返回值。无论是否将某些内容传递到
CustomObj
中。1。你没有对
数据做任何事情,为什么它会在那里?2.在每次调用中重新定义CustomObj.prototype是毫无意义的。只执行一次,不要在函数内部执行。3.构造函数的返回值在用于构造对象时被忽略(
new…
)。4.您不再具有标准对象方法。5.我看到您在继承
对象方面改变了主意。我在想这个问题,就像我想创建一个自定义对象一样。对象获取数据<代码>新对象({'hello':'world'})
新对象()
,并返回数据。@Amit 1。我不知道数据是什么,我想它的属性可以复制到构造函数中CustomObj的原型上。2.请发布您的解决方案。3.那么为什么删除return语句会产生不同的结果呢?4.为什么需要它们?请举例说明。5.是的。感谢您分享您的知识。@Amit
构造函数的返回值将被忽略
只有当返回值不是对象时,这才是真的。非常感谢。但是,它不能满足一个主要要求,
数据
自定义对象
的返回值。无论是否将某些内容传递到
CustomObj
中。1。你没有对
数据做任何事情,为什么它会在那里?2.在每次调用中重新定义CustomObj.prototype是毫无意义的。只执行一次,不要在函数内部执行。3.构造函数的返回值在用于构造对象时被忽略(
new…
)。4.您不再具有标准对象方法。5.我看到您在继承
对象方面改变了主意。我在想这个问题,就像我想创建一个自定义对象一样。对象获取数据<代码>新对象({'hello':'world'})
新对象()
,并返回数据。@Amit 1。我不知道数据是什么,我想它的属性可以复制到构造函数中CustomObj的原型上。2.请发布您的解决方案。3.那么为什么删除return语句会产生不同的结果呢?4.为什么需要它们?请举例说明。5.是的。感谢您分享您的知识。@Amit
构造函数的返回值被忽略
只有当返回值不是对象时,这才是正确的。我实际上认为这是因为我返回的是一个泛型对象,它是
对象的实例。所有这些信息都很好,但它不是一个答案:)@ThomasReggi-我的回答很恭敬地解释了为什么您的表达式计算为true。这是基于事实,而不是假设。这就是
instancrof
的定义。这是否作为一个答案让你满意,这完全是你的决定,我只希望这个答案能帮助你理解。正如您在对问题的评论中所写的,与您的用例无关,您想了解这个问题……我是说我认为这个答案对正在发生的事情的描述是错误的,