我正在使用Revealing Prototype Pattern并且有两个不同的原型,我将它放入同一个JavaScript文件中。这些链接是我发现的与此相关的文章。 http://bit.ly/U83hdg,http://bit.ly/VmJ71h。
我的印象是,这些操作会像原子类一样运行,其中与一个相关的功能不会意识到另一个功能。
例如,这两个原型都具有“init”和“set”功能。我在浏览器中看到的行为是,即使代码引用了第一个原型名称,也会执行最后一个版本的“init”。
这是我的两个原型中的通用精简代码。
var operationA = function (control, settings) {
this.control = control;
this.settings = settings;
};
operationA.prototype = function () {
init = function () {
// do something
return this;
}
set = function () {
// do something
return this;
};
return {
init: init,
set: set
};
}
var operationB = function (control, settings) {
this.control = control;
this.settings = settings;
};
operationB.prototype = function () {
init = function () {
// do something
return this;
}
set = function () {
// do something
return this;
};
return {
init: init,
set: set
};
}
这就是我实例化第一个对象的方式。
var objectASettings = {
property1: 48,
property2: 37
};
var objectA = new operationA('#mySelector', objectASettings);
objectA.init().set();
当上面运行时,正在执行来自操作B的原型的init和set函数,而不是从操作A的原型执行init和set函数。
我假设这些原型基本上将其包含的函数命名为。我是否需要为operationA和operationB创建唯一的公共函数名称(如initA,setA,initB,setB)?
有没有办法自我包含和/或命名这些公共函数,所以我可以在同一个文件中公开相同的init操作名称并在2个不同的原型上设置?
感谢您的帮助。
答案 0 :(得分:7)
要使其发挥作用的几件事情:
以下是一个适合您的示例:
<html>
<head>
<script>
var operationA = function (control, settings) {
this.control = control;
this.settings = settings;
};
operationA.prototype = function () {
var init = function () {
// do something
return this;
},
set = function () {
alert('set A');
return this;
};
return {
init: init,
set: set
};
}();
var operationB = function (control, settings) {
this.control = control;
this.settings = settings;
};
operationB.prototype = function () {
var init = function () {
// do something
return this;
},
set = function () {
alert('set B');
return this;
};
return {
init: init,
set: set
};
}();
window.onload = function() {
var objectASettings = {
property1: 48,
property2: 37
};
var objectBSettings = {
property1: 50,
property2: 50
};
var objectA = new operationA('#mySelector', objectASettings);
objectA.init().set();
var objectB = new operationB('#foo', objectBSettings)
objectB.init().set();
}
</script>
</head>
答案 1 :(得分:4)
在定义var
和init
时,您忽略了set
关键字,因此它们都被分配到全局对象。
答案 2 :(得分:0)
只需将原型定义为对象。
var operationA = function (control, settings) {
this.control = control;
this.settings = settings;
};
operationA.prototype = {
init: function () {
// do something
return this;
},
set: function () {
// do something
return this;
}
}
var operationB = function (control, settings) {
this.control = control;
this.settings = settings;
};
operationB.prototype = {
init: function () {
// do something
return this;
},
set: function () {
// do something
return this;
}
};