确定构造函数是否在JavaScript构造函数设计模式中的同一元素上调用

时间:2019-05-16 08:10:36

标签: javascript constructor

我一直在使用这样的构造器模式:

function Class(parameter) {
  this.id = parameter;
}

let testOne = new Class('a');
let testTwo = new Class('a');

console.log(testOne === testTwo);
console.log(testOne == testTwo);
console.log(testOne.id === testTwo.id);

如您所见,我的第一个console.log(testOne === testTwo)返回了false。我认为这与以下事实有关:即使new构造对象的不同实例具有相同的确切属性,也始终彼此不同。除了直接检查其唯一性和识别性之外,还有另一种方法来检查两个对象是否具有相同的确切属性吗?

2 个答案:

答案 0 :(得分:2)

  

内部js有两种不同的方法来检查相等性,   原语(如字符串)用于值比较和对象(arrays,Date对象)   它可供参考(通过引用进行的比较基本上可以检查到   看看给定的对象是否指向内存中的相同位置。)

这是一种通过值检查对象相等性的方法

function Class(parameter) {
  this.id = parameter;
}

let testOne = new Class('a');
let testTwo = new Class('a');
//console.log(testOne === testTwo);//gives false 
//console.log(testOne == testTwo); // gives false
//
let testThree=testOne;
console.log(testOne === testThree);//gives true (As they both refer to the same instance in memory now)


/// objects equality by value


function isEquivalent(a, b) {
    // Create arrays of property names
    var aProps = Object.getOwnPropertyNames(a);
    var bProps = Object.getOwnPropertyNames(b);

    // If number of properties is different,
    // objects are not equivalent
    if (aProps.length != bProps.length) {
        return false;
    }

    for (var i = 0; i < aProps.length; i++) {
        var propName = aProps[i];

        // If values of same property are not equal,
        // objects are not equivalent
        if (a[propName] !== b[propName]) {
            return false;
        }
    }

    // If we made it this far, objects
    // are considered equivalent
    return true;
}

// Outputs: true
console.log(isEquivalent(testOne, testTwo));

如果您觉得该方法又长又复杂,可以尝试使用lodash之类的某些库,该库已内置用于此类任务的函数。

function Class(parameter) {
  this.id = parameter;
}

let testOne = new Class('a');
let testTwo = new Class('a');


console.log(_.isEqual(testOne, testTwo));
// => true
 
console.log(testOne === testTwo);
// => false
<script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.17.11/lodash.core.js"></script>

答案 1 :(得分:0)

您可以创建一个比较两个浅层物体的函数。

function Class(parameter) {
  this.id = parameter;
}

let testOne = new Class('a');
let testTwo = new Class('a');

function compObj(obj1,obj2){
    if(Object.keys(obj1).length !== Object.keys(obj2).length) return false;
    for(let key in obj1){
        if(obj1[key] !== obj2[key]) return false;
    }
    return true;
} 
console.log(compObj(testOne,testTwo));