关于javascript对象的困惑

时间:2013-12-08 15:47:28

标签: javascript

为什么这不起作用?

function displayValue(a,b){
     this.a = a;
    this.b = b;
    $('p').text(a + " " + b);
}

var display = new displayValue();
display('1','2');

为什么即使没有'new'关键字也能正常工作?

function displayValue(a,b){
     this.a = a;
    this.b = b;
    $('p').text(a + " " + b);
}

var display =  displayValue('1','one');

使用new关键字,我创建了一个对象吗?如何更改displayValue的属性?

2 个答案:

答案 0 :(得分:2)

  

为什么即使没有'new'关键字也能正常工作?

您的第一个示例 不起作用。您会在段落元素中获得"undefined undefined",并在调用display时在控制台中显示错误,因为display不是函数。

  

如果使用new关键字,我是否创建了[sic]对象?

是。 new运算符创建一个新对象,然后调用构造函数,以便函数中的this是对新对象的引用。

在第二种情况下,如果您不使用new,则在displayValue this的调用中实际上是对window对象的引用,即浏览器中的全局对象。 (如果您使用的是JavaScript的新“严格”模式,this将为undefined并且您在执行this.a = a;时会出错。)

  

如何更改displayValue的属性?

我害怕我不明白这个问题。如果您的目标是使用构造函数返回具有ab属性的对象,然后您可以使用这些属性更新段落的文本,则它可能看起来像这样:

// Defining it
function DisplayValue(a, b) {
    this.a = a;
    this.b = b;
}
DisplayValue.prototype.display = function() {
    $("p").text(this.a + " " + this.b);
};

// Using it
var d = new DisplayValue(1, 2);
d.display(); // Changes all paragraphs to "1 2"
d.a = "A";
d.b = "B";
d.display(); // Changes all paragraphs to "A B"

答案 1 :(得分:0)

JavaScript中的

函数有两个不同的角色:

1-它们作为您在第二个区块中使用它的功能。 2-它们可以用作制作对象的类,就像你在第一个块中使用它一样。

相同的功能将作为不同的手段,例如:

var display = new displayValue();

表示您要根据类(函数)创建对象,因为您使用了new关键字,而display的结果var display = new displayValue();不是函数它是一个javascript对象,您可以获得这样的道具:display.adisplay.b。但是当它用作以下方法时:

displayValue('1','one');

这样,它只是一个被调用的函数,这里最重要的一点是this在这个函数中指向函数的容器对象,它主要是你的顶级类或window宾语。 在你的功能:     function displayValue(a,b){         this.a = a;         this.b = b;         $('p')。text(a +“”+ b);     } 当你执行this.a = a;时,大多数情况下它意味着你想将它用作类或顶层类中的方法,例如:

function Display(){
    this.displayValue=function displayValue(a,b){
       this.a = a;
       this.b = b;
       $('p').text(a + " " + b);
    }
}

function Display(){
   //the constructor
}
Display.prototype.displayValue = function displayValue(a,b){
   this.a = a;
   this.b = b;
   $('p').text(a + " " + b);
};

在此示例中,如果您尝试var obj = new Display();this函数中的displayValue关键字将指向Display的当前实例obj。< / p>