new和instanceof Javascript

时间:2016-10-04 10:25:47

标签: javascript new-operator instanceof

您好我是Javascript的新手。我对新单词及其在决定instanceof运算符输出方面的作用感到困惑。

案例1.返回对象字面值

var Dog=function(){
return{legs:4,bark:alert("BOW!!")};};

var luna=Dog();

luna instanceof Dog;//why false here
false

var luna=new Dog();

luna instanceof Dog;//why false here
false

案例2:现在我没有做任何事情,而是返回对象文字,

var Dog=function(){
};
var luna=Dog();

luna instanceof Dog
false

var luna=new Dog();

luna instanceof Dog;//why true here
true

3 个答案:

答案 0 :(得分:4)

var luna=Dog();
luna instanceof Dog;//why false here

因为你:

  1. 未使用new运营商
  2. 返回一个简单的对象
  3. var luna=new Dog();
    luna instanceof Dog;//why false here
    

    因为您返回了一个简单的对象 overrode new运算符创建的对象。

    var luna=new Dog();
    luna instanceof Dog;//why true here
    

    因为你:

    1. 使用new运算符
    2. 未覆盖返回值

答案 1 :(得分:1)

案例1:

var Dog=function(){
return{legs:4,bark:alert("BOW!!")};};

var luna=Dog();
luna instanceof Dog;
false

这里你没有实例化任何东西,它只是一个返回值的函数:一个普通的Object。这或多或少相当于:

var Dog=function(){
return new Object();
}

返回值的构造函数是Object:luna.constructorObject()函数。

var luna=Dog();
luna instanceof Dog;
false


var luna=new Dog();

luna instanceof Dog;
false

您无法实例化返回某些内容的函数

案例2:

var Dog=function(){
};
var luna=Dog();

它被称为一个函数,一个不返回任何东西的函数,实际上它返回undefined

luna instanceof Dog
false 

因为undefined不是任何实例

var luna=new Dog();

创建一个新的Object,其中Dog为构造函数luna.constructorDog()

luna instanceof Dog;//luna is an object here
true

new运算符用于指定函数应该做什么:没有它它返回一些东西(或undefined),用它从构造函数实例化一个新对象(这里是Dog

答案 2 :(得分:1)

使用function关键字创建类可能会造成混淆。当您使用Dog()关键字呼叫new时,您只需要调用一个函数;不涉及课程。

在案例1中,第一个luna只是将Dog作为普通函数调用时的结果:{legs:4, bark: alert("BOW!!")}并且与Dog作为一个类无关。第二个luna也是如此。由于Dog返回一个对象,它会覆盖"类"通常使用new创建的实例。

在案例2中,第一个luna就像案例1中的第一个luna一样,是一个普通对象。但是第二个lunaDog的一个实例,因为使用了new关键字,这意味着Dog被视为类而不是函数,并且没有任何内容返回Dog

(另外,您应该将对象更改为{legs: 4, bark: function() { alert("BOW!!"); }}。)