是否有可能在不使用唯一对象属性的情况下区分两个对象?

Is it possible to differentiate two objects without using unique object properties?

本文关键字:对象 两个 情况下区 属性 有可能 是否 唯一      更新时间:2023-09-26

我想创建两个没有区别属性的对象,并确定它们之间的区别,但是我尝试过的每种方法都失败了。

//this results in false x2
function Special() {
}
var objects = {};
objects.obj1 = {};
objects.obj2 = {};
objects.obj2.constructor = Special;
for (property in objects) {
  if (objects[property] instanceof Special) {
    console.log(true);
  } else {
    console.log(false);
  }
}

//this results in false x2
function Special() {
  return {};
}
var objects = {};
objects.obj1 = {};
objects.obj2 = new Special();
for (property in objects) {
  if (objects[property] instanceof Special) {
    console.log(true);
  } else {
    console.log(false);
  }
}

//this hangs the page
function Special() {
  this = {};
}
var objects = {};
objects.obj1 = {};
objects.obj2 = new Special();
for (property in objects) {
  if (objects[property] instanceof Special) {
    console.log(true);
  } else {
    console.log(false);
  }
}

是否有可能在不使用唯一对象属性的情况下区分两个对象?为什么或者为什么不呢?

澄清一下,我尽量避免这样:

var objects = {
    obj1 : {
       type : 'normal'
    },
    obj2 : {
       type : 'special'
    }
}

背景:

我正在使用一个"目录"类型的数据结构,并保持结构尽可能简单,我希望一些属性只是子目录,而其他属性是目录中的项目,然而,因为子目录和项目都可以是对象,我们不想限制项目拥有自己的"类型"属性,我寻找一种不同的方式来区分-我认为构造函数类型可能是一个解决方案。

所以,我最终想要一个这样的数据结构:

var directory = {
    handlers : { //child directory
        button1 : function() {} //item
    },
    selectors : { //child directory
        button1 : '#button-1' //item
    },
    title : 'hello world', //item
    data : { //item
        property1 : 1
    }
}

我不需要添加复杂的层次来区分代表项目和目录的对象

是否有可能在不使用唯一对象属性的情况下区分两个对象?为什么或者为什么不呢?

不,你不能。因为javascript是动态类型的,所以你可以动态地修改对象属性:

function Friend(name){
    this.name = name;
}
Friend.prototype.get = function(){
    return this.name;
}
var pete = new Friend('Pete');
pete.get(); //'Pete'
pete instanceof Friend; //true
pete.get = function(){
    return 'hacked!';
}
pete.get(); //'hacked!'
pete.get; //Function...
pete instanceof Friend; //true
delete pete.name;
delete pete.get;
pete.name; //undefined
pete.get; //undefined
pete instanceof Friend; //still true 
因此,instanceof现在说pete 是一个 Friend,然后依附于Friend的接口。但是,pete现在没有名称,也没有附加get函数。要知道两个对象是否具有完全相同的属性,或者至少具有相同的函数集合,唯一的方法是遍历它们并手动检查。而且,如果两个物体在某一时刻恰好具有相同的属性,那么最近就会发生变化。

潜在的问题是,在javascript中,没有类似类的东西:只有普通对象。像new, constructor或instanceof这样的语言结构被放入语言中以重新组装Java,但它们实际上根本不适合委托原型继承,并且instanceof和constructor属性可以通过许多方式被破坏。

通常,对象。isPrototypeOf是一种更好的方法来检查一个对象是否从另一个对象继承(虽然有不同的方法来检查不同的事情),因为,好吧,即使你添加或删除一个对象的属性,它将默认为它的原型,只要你不弄乱原型本身。