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
}
答案 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 () {
// ...
},
// ...
};