tyr*_*dis 4 javascript inheritance closures prototype
我知道你可以通过使用闭包和立即调用函数在JavaScript中实现"私有性".
但是,如果我需要全功能原型设计呢?我根本不知道在对象的原型中有私有成员.如果我使用特权方法,我可以拥有私有变量和公共方法,但我失去了原型设计的选项.
Douglas Crockford"禁止"使用悬空(在标识符前加上下划线表示它不是公共接口的一部分).
但使用它是不是很糟糕?因为没有办法让它真正私密.
你对此有何看法?你怎么处理它?
首先,在使用功能继承模式时,您并没有真正失去原型效果.我只是假设你在谈论好的部分,crockford还介绍了一种非常简单有效的方法来为该模式提供共享变量.基本上看起来像:
var Human = (function(my, priv) {
var my = my || {},
priv = priv || {};
my.privatedata = "foobar";
priv.walk = function() {
console.log('walking');
return priv;
};
priv.talk = function() {
console.log('blah blah');
return priv;
};
return priv;
}());
var Andy = (function(my, priv) {
var my = my || {},
priv = Human(my, priv);
priv.SpecialAndyThing = function() {
console.log('bloggin at typeofnan.com');
return priv;
};
return priv;
}());
var myAndy = Andy();
myAndy.talk().SpecialAndyThing();
Run Code Online (Sandbox Code Playgroud)
你甚至可以简单地扩展这项技术,以获得一些超级方法.使用隐含变量约定(如下划线或诸如此类的东西)通常只是不好的做法.它令人困惑,因为没有人知道那里发生了什么(如果你是唯一一个使用代码库的人,那么这个论点可能会失败).
但是,ECMAscript Edition 5引入了一些好处,以便在原型链中拥有更多"私有"成员.一个重要的方法是.defineProperty,您可以定义一个不"浅"的属性.看起来像:
var Human = {};
Object.defineProperty(Human, 'privateStuff', {
value: 'secret',
enumerable: false
});
Run Code Online (Sandbox Code Playgroud)
现在,privateStuff对于从Human原型链继承的对象,该属性不可见.无论如何,这个东西需要Javascript 1.8.5,目前仅在尖端浏览器中可用.请参阅https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/Object/defineProperty