什么是一些创建自定义Javascript对象的惯用方法

时间:2012-08-09 18:12:08

标签: javascript oop

我正在创建一个自定义对象,用于我工作的一些内部应用程序。我研究了一些方法来做这件事 - 这就是我出来的。

function ISGrader(text)
{
this.text = text;

this.printInfo = function(){
    alert("Object working " + text);    
}

this.putGrade = function(score)
{
           alert(score);
}
 }

我相信这会显示构造函数类型的功能,以及我将构建的一些简单的启动方法。

上述良好做法还是其他方式更标准?

5 个答案:

答案 0 :(得分:2)

我更喜欢这种模式(IIFE),但这纯粹是意见:

var ISGrader = (function (text) {
    // anything declared here is "private"
    var printInfo = function() {
        alert("Object working " + text);    
    };

    var putGrade = function (score) {
        alert(score);
    };

    // put "publicly" accesible things in the returned object
    return {
        text: text,
        printInfo: printInfo,
        putGrade: putGrade
    };
})(text);

答案 1 :(得分:2)

我更喜欢类似下面的模式。您可以将其视为一个分为四步的方法:

(function(parent) {

// 1. Declare private variables and functions that will be
// accessible by everybody within the scope of this 
// function, but not outside of it.
var doSomethingAwesome = function() { .. }; // private function
var coolInteger = 42; // private variable

// 2. Create the constructor function
function ISGrader() {
    ..
}

// 3. Create shared public methods on the prototype object.
// These will be created only once, and shared between all objects
// which is more efficient that re-creating each method for each object.
ISGrader.prototype.printInfo = function() { .. };
ISGrader.prototype.putGrade = function(score) { .. };

// 4. Expose the constructor to the outside world.
parent.ISGrader = ISGrader;

})(window);

所有内容都包含在自执行匿名函数中的原因是为了确保我们在其中创建的私有变量不会泄漏到封闭范围之外,并且基本上保持干净。

声明这样的构造函数的另一个好处是,您可以通过更改单个单词轻松地将父对象从say window更改为另一个命名空间对象。

答案 2 :(得分:1)

始终建议使用`prototype'来完成。这样你也可以继承它的属性并创建一个新属性。

var ISGrader = function(text) {
    this.text = text;

    var _privateVar = text;

    this.updatePrivateVar = function(newText) {
        _privateVar = newText;
        alert("private variable updated");
    }
}
ISGrader.prototype.text = "";
ISGrader.prototype.printInfo = function() {
    alert("Object working " + this.text);
}
ISGrader.prototype.putGrade = function(score) {
    alert(score);
}

var isGrader = new ISGrader("hello");
isGrader.printInfo();



// Inherit and create a new definition
var ISGrader2 = function() {}
ISGrader2.prototype = new ISGrader();

var isGrader2 = new ISGrader("hello2");
isGrader2.printInfo();
isGrader2.updatePrivateVar("hello3");

演示:http://jsfiddle.net/rkspP/3/

答案 3 :(得分:0)

虽然不是真正的答案,但我推荐Douglas Crockford的书JavaScript: The Good Parts,因为它很好地向您介绍了该语言的“好部分”,并讨论了创建对象的不同方法的优缺点。在JavaScript中。

如果您只想查找JavaScript对象中成员可见性的说明,您还可以查看此资源:http://javascript.crockford.com/private.html

答案 4 :(得分:0)

如果您计划在单个页面上创建多个ISGrader对象,那么将函数粘贴到分配给ISGrader的原型对象中会更加节省内存:

function ISGrader(text) {
    this.text = text;
}

ISGrader.prototype = {
    printInfo: function() {
        alert("Object working " + this.text);
    },
    putGrade: function(score) {
        alert(score);
    }
}