如何继承/扩展使用“显示原型”模式的类?有没有办法制作private变量和函数protected?
private
protected
基础对象示例:
myNameSpace.Person = function() { this.name= ""; this.id = 0; }; myNameSpace.Person.prototype = function(){ var foo = function(){ //sample private function }; var loadFromJSON = function (p_jsonObject) { ... }; var toJSON = function () { ... }; var clone = function (p_other) { ... }; return { loadFromJSON : loadFromJSON, toJSON: toJSON, clone: clone }; }();
JavaScript中没有受保护的变量/属性。但是,当您在同一范围内声明继承类时,可以重用“私有”变量,当私有变量只是原型的“隐藏实用程序”时,这似乎是可能的。
MyNamespace.Person = function Person(params) { // private variables and functions, individual for each Person instance var anything, id; function execute_something() {} // public properties: this.name = ""; this.getId = function getId(){ // called a "privileged function", because it has access to private variables } } MyNamespace.American = function(params) { MyNamespace.Person.call(this, params); // inherit name and getId() } (function() { // new scope for // hidden utility functions and other private things function foo() { } function helpJSON() { } function fromJSON() { } var bar; (function(personProto) { // new scope for prototype module (not explicitly needed) // "private" /static/ variables (and functions, if you want them private) var personCount = 0; personProto.clone = function clone() { return this.constructor(myself); // or something }; personProto.toJSON = function toJSON() { // use of helpJSON() }; personProto.fromJSON = fromJSON; // direct use })(MyNamespace.Person.prototype); (function(amiProto) { // just the same as above, if needed amiProto.special = function() { // use foo() and co }; })( MyNamespace.American.prototype = Object.create(MyNamespace.Person.prototype) ); })();
这是JavaScript的继承方式,这意味着American的原型从Person的原型自动继承了clone(),toJSON()和fromJSON()函数。当然可以改写了。功能是
new MyNamespace.American() instanceof MyNamespace.Person; // true
当然,如果不需要,并希望使用类似模块的方式,则可以重用实用程序功能,即仅复制它们:
(function() { // hidden utility functions and other private things var bar; var personCount; function foo() { } function helpJSON() { } function fromJSON() { } function clone() { return this.constructor(myself); // or something } function toJSON() { } (function(personProto) { // new scope, not really needed // private variables are useless in here personProto.clone = clone; personProto.toJSON = toJSON; personProto.fromJSON = fromJSON; })(MyNamespace.Person.prototype); (function(amiProto) { // new scope, not really needed // copied from personProto amiProto.clone = clone; amiProto.toJSON = toJSON; amiProto.fromJSON = fromJSON; // and now the differences amiProto.special = function() { // use foo() and co }; })(MyNamespace.American.prototype); })();