使用模块模式的JavaScript类原型
我正在寻找用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可以在开始时使用。
我也尝试过的模式:
我的方法可以接受吗?
**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 (...) {...};
}
这是你问了两年多了,但在谷歌搜索一个类似的方法,我最终在这里。 除了(因为你实质上是在征求意见)之外,我没有看到你的实现有什么缺点,它似乎有点混淆你为什么将原型作为IIFE导入的原因。
否则,你得到的东西看起来非常类似于我所见过的“显示原型模式”的其他“标准”实现:
(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();
还有一个类似的模块模式,它的结构可能更像是你之后的“类”实现 :
(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();
要点:https://gist.github.com/dgowrie/24fb3483051579b89512
链接地址: http://www.djcxy.com/p/50131.html上一篇: JavaScript class prototyping using module pattern
下一篇: Javascript: Module Pattern vs Constructor/Prototype pattern?