在JavaScript中最好声明一个属性是什么?

时间:2014-08-21 17:58:41

标签: javascript

如果在声明变量时在JavaScript中构建函数类型类,那么最好使用

  var this.variableName = variableName 
  var this.x = x

或者这样做会更好。

  this.x

我尝试使用var并在Google debuger中出错。为什么会出现这种情况,或者属性与在函数“object”中设置的变量不同。

代码:

function Circle(x,y,r) {
    this.x = x;
    this.y = y;
    this.r = r;
    // I've added the drawing code to the actual circle
    // they can draw themselves.
    this.draw = function(context){
        context.beginPath();
        context.arc(this.x, this.y, this.r, 0, Math.PI*2, true);
        context.closePath();
        context.fill();
    }
}

1 个答案:

答案 0 :(得分:0)

当一个对象被声明时,它已经被声明了,所以做这样的事情不仅是非法的,而且是多余的。

// DON'T DO THIS!!!
var this.a = 'a'; // NO!!!!!!!!!

相反,只需声明你的对象,然后只需将东西附加到该对象,因为它已经初始化了

var obj = {};
obj.a = 'a';
obj.b = 'b';

在对象中声明函数时可能遇到的问题是范围问题以及this在Javascript中的工作原理。

为此,您有几种选择:

声明一个that变量,然后可以在函数中使用该变量:

function Circle(x,y,r) {
    this.x = x;
    this.y = y;
    this.r = r;
    // I've added the drawing code to the actual circle
    // they can draw themselves.
    var that = this;
    this.draw = function(context){

        // this refers to the global object (window)
        // that refers to your Circle Object
        context.beginPath();
        context.arc(that.x, that.y, that.r, 0, Math.PI*2, true);
        context.closePath();
        context.fill();
    }
}

如果您使用的是支持ECMAScript 5的浏览器(不是IE8),则可以将该功能绑定到Circle对象。

function Circle(x,y,r) {
    this.x = x;
    this.y = y;
    this.r = r;
    // I've added the drawing code to the actual circle
    // they can draw themselves.


    this.draw = function(context){
        context.beginPath();
        context.arc(this.x, this.y, this.r, 0, Math.PI*2, true);
        context.closePath();
        context.fill();
    }.bind(this);
}

如果您想支持IE8并使用.bind,您可以使用underscore.js并使用_.bind功能。

function Circle(x,y,r) {
    this.x = x;
    this.y = y;
    this.r = r;
    // I've added the drawing code to the actual circle
    // they can draw themselves.


    this.draw = _.bind(function(context){
        context.beginPath();
        context.arc(this.x, this.y, this.r, 0, Math.PI*2, true);
        context.closePath();
        context.fill();
    }, this);
}