正确使用Prototype对象

时间:2010-10-21 13:20:25

标签: javascript

HI,

我有一个用对象文字语法编写的JavaScript程序:

var MyJsProgram = {

    someVar: value1,
    somevar2: value2,

    init : function() {
        //do some initialisation
    },

    libraryFunction : function() {

    },

    getStyle : function() {

    },

    extend : function() {

    }
}

此脚本可以同时运行多个实例。我应该将常用方法移动到myJsProgram的原型对象中吗?如果是这样,这种语法是否正确?

 var MyJsProgram = {

    someVar: value1,
    somevar2: value2,

    init : function() {
        //do some initialisation
    },

    //more methods/members here that are unique to each instance
}

myJsProgram.prototype = {
    //all shared methods here
}

2 个答案:

答案 0 :(得分:3)

首先,创建一个函数,您可以从中创建实例

// Make it a function, so you can make a new instance
var stdProgram = function(){};

// All shared methods go here
stdProgram.prototype = {
  echo: function(message){
    alert(message);
  },
  extend: function(key, value){
    this[key] = value;
  }
};

然后你可以制作你的特定'程序',实际上只是基类的实例

// And here you can make instances for specific programs
var myFirstProgram = new stdProgram(),
    mySecondProgram = new stdProgram();

myFirstProgram.extend('unique', function(){ 
  alert('I am unique');
});

mySecondProgram.aVar = 'test';

要确保一切正常,请尝试以下方法:

myFirstProgram.unique();     // Should alert I am unique
mySecondProgram.unique();    // Should throw an error, unique is undefined

alert(mySecondProgram.aVar); // Should alert test
alert(myFirstProgram.aVar);  // Should echo undefined

myFirstProgram.echo('hi');   // Should alert hi
mySecondProgram.echo('hi');  // Should alert hi

答案 1 :(得分:2)

不,该语法不正确(没有冒犯);)

您需要创建一个对象以使用其原型。这意味着您需要一个构造函数(这是JavaScript中的一个函数)。适用于您的问题:

var MyJsProgram = function (value1, value2) {
    // "this" refers to the current instance of this object
    this.someVar = value1;
    this.someVar2 = value2;
    // do some initialization
};

像这样创建新对象:

var jsProgramInstance = new MyJsProgram(value1, value2);

原型是这些对象的实例成员。它们的定义如下:

MyJsProgram.prototype.someSharedMethodName = function () {
    // do shared method stuff here
    // (this.someVar and this.someVar2 are available here)
};

像这样使用它们(在您之前创建的实例上):

jsProgramInstance.someSharedMethodName();

你应该执行以下操作,因为它会覆盖可能存在的现有原型属性(由于继承):

MyJsProgram.prototype = {
    someSharedMethodName: function () {
        // ...
    },
    // ...
};