创建javascript对象之间的区别

时间:2014-10-21 08:50:45

标签: javascript

当创建一个以OO方式使用JS的对象时,JS引擎之间是否有任何区别(除了能够定义构造函数:

var Uploader = Uploader || {};

var Uploader = function() {

}

function Uploader() {

}

特别是以后,你希望按照

的方式做点什么
Uploader.DOM = {    
    Create: function(file) {

    }
};

完全取决于个人喜好吗?或者有真正的区别吗?

1 个答案:

答案 0 :(得分:1)

<强>物件:

var MyObj = {
    myArr: [1,2,3],
    find: function(/*some arguments*/) {
        //some logic that finds something in this.myArr
    }
}

MyObj.find函数中,this关键字将指向MyObj(这有点类似this在具有类的语言中的工作方式)。您可以使用此功能执行混合

var MyObj2 = {
    myArr: [4,2,6]
}

MyObj2.find = MyObj.find;

MyObj2.find函数this中,关键字将指向MyObj2

此外,对象支持getter和setter(适用于IE9 +和所有优秀的浏览器):

var MyObj = {
    myArr: [1,2,3],
    find: function(/*some arguments*/) {
        //some logic that finds something in this.myArr
    },
    get maxValue() {
        return Math.max.apply(null, this.myArr);// maxValue is calculated on the fly
    },
    a_: null,
    get a () {
        return this.a_;
    },
    set a (val) {
        //fire a change event, do input validation
        this.a_ = val;
    }
}

现在可以像这样访问数组中的最大值:MyObj.maxValue。我还添加了一个属性a_。它的名称与getter和setter的名称不同,因此附加了下划线。附加或前置下划线是私有变量的命名约定,不应直接访问。

var qwe = MyObj.a // get a_
MyObj.a = 'something'; //set a_

<强>功能

var u = new Uploader(); // will throw an exception
var Uploader = function() { }

上传器在运行时定义。当我尝试实例化它时它还不存在。

var u = new Uploader(); //will work
function Uploader() {}

上传器在编译时定义,因此可以使用。

功能可以与揭示模式一起使用以隐藏某些成员。函数不支持getter和setter,但你可以将对象放在函数中。

function myFunc() {
    function privateFunc() {};
    function publicFunc() {};
    var obj = {
        //members, getters, setters
    };
    return {
       publicFunc: publicFunc,
       obj: obj
    }
}

您可以在muFunc.publicFunc()之外拨打myFunc,因为它已被退回。但是你不能在外面使用privateFunc,因为它不会被返回。 揭示模式函数通常不是要实例化的。这是因为当您实例化它时,内部的所有内容都将被复制到新实例中。因此,与使用prototype添加函数相比,它会占用更多内存。

myFunc.prototype.someFunc = function() {};

与此类似,myFunc的所有实例都会共享someFunc的相同实例。

结论:使用函数可以模拟private访问修饰符,但在对象中,this关键字的行为与您在具有类的语言中所期望的有些相似。但是,您始终可以使用callapplybind来更改该函数的上下文(即'this'关键字将是什么)。