Javascript 如何区分使用{}创建的对象与使用new关键字创建的对象

Javascript 如何区分使用{}创建的对象与使用new关键字创建的对象,javascript,Javascript,有两种方法可以创建对象 直接的 var x={} 使用新关键字,即使用构造函数 var x=新对象(); //或 var x=新日期()//使用构造函数 有没有办法确定该对象是如何创建的 您无法区分普通对象的创建,因为对于javascript来说,这是完全相同的事情 var o1 = {}; var o2 = new Object(); 您无法区分普通对象的创建,因为对于javascript来说,这是完全相同的事情 var o1 = {}; var o2 = new Object(); 基本

有两种方法可以创建对象

  • 直接的

    var x={}

  • 使用新关键字,即使用构造函数

    var x=新对象(); //或 var x=新日期()//使用构造函数


  • 有没有办法确定该对象是如何创建的

    您无法区分普通对象的创建,因为对于javascript来说,这是完全相同的事情

    var o1 = {};
    var o2 = new Object();
    

    您无法区分普通对象的创建,因为对于javascript来说,这是完全相同的事情

    var o1 = {};
    var o2 = new Object();
    

    基本上,在JavaScript中,我们不关心对象是如何创建的。我们通常只是假设,如果物体走路像鸭子,说话像鸭子,那它就是鸭子。(这被称为“duck typing”),结果也一样,因为我们不知道对象是如何创建的

    这里有两个问题:

  • 如何判断对象是使用对象初始值设定项(
    {}
    )还是
    新对象创建的,以及

  • 如何判断对象是使用其中一个构造函数还是其他构造函数(如
    Date
    )创建的

  • 问题1的答案是:你不能。结果对象没有任何区别,因此您无法判断它是如何创建的

    问题2的答案更为复杂:

    你不能确定,一个对象是用一个给定的构造函数创建的。JavaScript太强大了,让您对对象有太多的控制权,这是不可能确定的

    你所能知道的只是对象的原型链告诉你的,从中你可以推断出它是如何构造的,但是这个推断可能是不正确的

    让我们拿你的

    var x = new Date();
    
    例如。要进行该推断,您至少可以使用三种工具:

  • instanceof
    :例如,
    if(x instanceof Date)
    instanceof
    是接受对象和函数的运算符。它检查对象的原型链,以查看函数的
    prototype
    属性所引用的对象是否在链中的任何位置。如果是这样,
    instanceof
    的结果是
    true
    ;如果不是,则为
    false
    。因此,如果对象是用
    newdate
    创建的(或者
    newfoo
    如果
    Foo
    派生自
    Date
    ),则
    x instanceof Date
    将为真

    但是,JavaScript确实很强大,你可以愚弄它。例如:

    var x=Object.create(Date.prototype);
    console.log(x instanceof Date);//真的
    
    基本上,在JavaScript中,我们不关心对象是如何创建的。我们通常只是假设,如果物体走路像鸭子,说话像鸭子,那它就是鸭子。(这被称为“duck typing”),结果也一样,因为我们不知道对象是如何创建的

    这里有两个问题:

  • 如何判断对象是使用对象初始值设定项(
    {}
    )还是
    新对象创建的,以及

  • 如何判断对象是使用其中一个构造函数还是其他构造函数(如
    Date
    )创建的

  • 问题1的答案是:你不能。结果对象没有任何区别,因此您无法判断它是如何创建的

    问题2的答案更为复杂:

    你不能确定,一个对象是用一个给定的构造函数创建的。JavaScript太强大了,让您对对象有太多的控制权,这是不可能确定的

    你所能知道的只是对象的原型链告诉你的,从中你可以推断出它是如何构造的,但是这个推断可能是不正确的

    让我们拿你的

    var x = new Date();
    
    例如。要进行该推断,您至少可以使用三种工具:

  • instanceof
    :例如,
    if(x instanceof Date)
    instanceof
    是接受对象和函数的运算符。它检查对象的原型链,以查看函数的
    prototype
    属性所引用的对象是否在链中的任何位置。如果是这样,
    instanceof
    的结果是
    true
    ;如果不是,则为
    false
    。因此,如果对象是用
    newdate
    创建的(或者
    newfoo
    如果
    Foo
    派生自
    Date
    ),则
    x instanceof Date
    将为真

    但是,JavaScript确实很强大,你可以愚弄它。例如:

    var x=Object.create(Date.prototype);
    console.log(x instanceof Date);//真的
    
    为什么您需要知道这一点?就我所知,javascript中没有任何规定。。。如果你解释你的情况,可能会有另一种方法来解决你的问题!!。。有人问我同样的问题interview@ankurkushwaha那个么答案是否定的,若你们正确解释了面试官的问题!为什么您需要知道这一点?就我所知,javascript中没有任何规定。。。如果你解释你的情况,可能会有另一种方法来解决你的问题!!。。有人问我同样的问题interview@ankurkushwaha那个么答案是否定的,若你们正确解释了面试官的问题!对,但它不仅仅是日期,它可以是Blob,它可以是任何自定义构造函数。如何创建一个泛型check@ankurkushwaha:嗯,
    instanceof
    constructor
    是一般检查。我还更新了一点来扩展这一点。基本上,在JavaScript中,我们不关心对象是如何创建的。对,但它不仅是日期,它可以是Blob,也可以是任何自定义构造函数。如何创建一个泛型check@ankurkushwaha:嗯,
    instanceof
    constructor
    是一般检查。我还更新了一点来扩展这一点。基本上,在JavaScript中,我们不关心对象是如何创建的。