是否有可能在不使用唯一对象属性的情况下区分两个对象?
Is it possible to differentiate two objects without using unique object properties?
我想创建两个没有区别属性的对象,并确定它们之间的区别,但是我尝试过的每种方法都失败了。
//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是一种更好的方法来检查一个对象是否从另一个对象继承(虽然有不同的方法来检查不同的事情),因为,好吧,即使你添加或删除一个对象的属性,它将默认为它的原型,只要你不弄乱原型本身。
相关文章:
- javascript函数,它接受两个输入:一个对象和一个键,并返回对象中该键的相应值
- 正在更新mongod中两个对象内部的数组
- 添加两个对象以获取值的总和
- 如何使用javascript合并两个对象数组
- 别名或以其他方式合并两个具有不同名称的相同对象原型
- 如何对两个嵌套对象进行排序
- 在JavaScript中相等两个对象.在更改一时,秒会自动更改
- js字符串转换为具有两个值的对象
- 如何使用AngularJs比较两个对象的JSON
- jQuery对象从html表中查询为两个一维数组,用于Chartist图表
- 交换对象上两个属性的值
- Backbone relational无法实例化两个RelationalModel对象
- 如何在javascript中合并两个对象数组
- 删除两个独立对象中的属性,而不使用多余的删除语句
- JavaScript - 合并两个对象数组并根据属性值删除重复数据
- 有可能让两个变量指向同一个对象吗?(javascript)
- 使用Javascript对象为具有两个背景图像的DIV设置样式时出现问题
- 如何在Javascript中连接两个结构不同的对象
- 如何使用jQuery合并两个json对象
- 如何按对象两个值对对象数组进行排序