我正在寻找在JavaScript中定义类的方法。我提出了混合模块和原型模式,但不确定我是否不会错过任何东西。基本上我想使用'this'关键字。例如:
var A = function()
{
this.x = 10;
};
A.prototype = (function()
{
function privatePrint()
{
alert("Printing from private! x:" + this.x);
}
this.print = function()
{
privatePrint.call(this);
};
return this;
}).apply(A.prototype);
var a = new A();
a.print();
返回值仅用于提高可读性 - 可以在开头使用A.prototype。
模式我也尝试过:
我的方法可以接受吗?
答案 0 :(得分:0)
**Public**
function Constructor(...) {
this.membername = value;
}
Constructor.prototype.membername = value;
**Private**
function Constructor(...) {
var that = this;
var membername = value;
function membername(...) {...}
}
Note: The function statement
function membername(...) {...}
is shorthand for
var membername = function membername(...) {...};
**Privileged**
function Constructor(...) {
this.membername = function (...) {...};
}
答案 1 :(得分:0)
自从你问过这两年以来,但在谷歌搜索类似的方法,我最终到了这里。除了(因为你基本上是在征求意见)之外,我没有看到你的实现的缺点,它似乎有点令人困惑,为什么你把原型作为IIFE的导入传递。
否则,您所拥有的内容与其他"标准"非常相似" Revealing Prototype Pattern" 的实现,我已经基本上看到了这样做:
(function (NS) {
'use strict';
// constructor for the Person "Class", attached to your global namespace
var Person = NS.Person = function (name) {
// set properties unique for each instance
this.name = name;
};
// may not be necessary, but safe
Person.prototype.constructor = Person;
// private method
var _privateMethod = function() {
// do private stuff
// use the "_" convention to mark as private
// this is scoped to the modules' IIFE wrapper, but not bound the returned "Person" object, i.e. it is private
};
// public method
Person.prototype.speak = function() {
console.log("Hello there, I'm " + this.name);
};
return Person;
})(window.NS = window.NS || {}); // import a global namespace
// use your namespaced Person "Class"
var david = new NS.Person("David");
david.speak();
还有一个类似的模块模式,其结构可能更像是" Class"实施,你在追求:
(function (NS) {
'use strict';
// constructor for the Person "Class", attached to your global namespace
var Person = NS.Person = function (name) {
// reset constructor (the prototype is completely overwritten below)
this.constructor = Person;
// set properties unique for each instance
this.name = name;
};
// all methods on the prototype
Person.prototype = (function() {
// private method
var _privateMethod = function() {
// do private stuff
// use the "_" convention to mark as private
// this is scoped to the IIFE but not bound to the returned object, i.e. it is private
};
// public method
var speak = function() {
console.log("Hello there, I'm " + this.name);
};
// returned object with public methods
return {
speak: speak
};
}());
})(window.NS = window.NS || {}); // import a global namespace
// use your namespaced Person "Class"
var david = new NS.Person("David");
david.speak();