什么';这种JavaScript编码风格有什么问题?(闭包与原型)
我们一直在讨论如何最好地处理JS应用程序中的对象,研究斯托扬·斯特凡诺夫的书,阅读无数关于“新”、“这个”、“原型”、“闭包”等的帖子(事实上,有这么多,而且他们有这么多相互竞争的理论,这表明没有完全明显的答案) 因此,让我们假设我们不关心私有数据。我们满足于相信用户和开发人员不会在我们定义的方式之外的对象中乱搞 考虑到这一点,这种技术有什么不对的地方(除了它似乎在挑战数十年的OO风格和历史之外)什么';这种JavaScript编码风格有什么问题?(闭包与原型),javascript,closures,prototype,Javascript,Closures,Prototype,我们一直在讨论如何最好地处理JS应用程序中的对象,研究斯托扬·斯特凡诺夫的书,阅读无数关于“新”、“这个”、“原型”、“闭包”等的帖子(事实上,有这么多,而且他们有这么多相互竞争的理论,这表明没有完全明显的答案) 因此,让我们假设我们不关心私有数据。我们满足于相信用户和开发人员不会在我们定义的方式之外的对象中乱搞 考虑到这一点,这种技术有什么不对的地方(除了它似乎在挑战数十年的OO风格和历史之外) // namespace to isolate all PERSON's logic var PE
// namespace to isolate all PERSON's logic
var PERSON = {};
// return an object which should only ever contain data.
// The Catch: it's 100% public
PERSON.constructor = function (name) {
return {
name: name
}
}
// methods that operate on a Person
// the thing we're operating on gets passed in
PERSON.sayHello = function (person) {
alert (person.name);
}
var p = PERSON.constructor ("Fred");
var q = PERSON.constructor ("Me");
// normally this coded like 'p.sayHello()'
PERSON.sayHello(p);
PERSON.sayHello(q);
显然:
关键点是前面提到的隐私问题。我知道我会因此受到抨击,但是,我在寻找任何反馈。干杯。它本身没有什么问题。但它确实放弃了使用Javascript原型系统所固有的许多优势
- 您的对象除了知道它是一个对象文字外,对自身一无所知。因此,
将无法帮助您识别其来源。你只能用鸭子打字instanceof
- 您的方法本质上是名称空间的静态函数,您必须通过传入对象作为第一个参数来重复自己。通过使用原型对象,您可以利用动态分派,因此
可以为p.sayHello()
或PERSON
执行不同的操作,具体取决于Javascript知道的类型。这是多态性的一种形式。您的方法要求您在每次调用方法时对类型进行命名(可能会出错)ANIMAL
- 实际上您不需要
函数,因为函数已经是对象了。您的构造函数
变量也可能是构造函数PERSON
function Person(name)
{
var p = Object.create(Person.prototype);
p.name = name; // or other means of initialization, use of overloaded arguments, etc.
return p;
}
Person.prototype.sayHello = function () { alert (this.name); }
var p = Person("Fred"); // you can omit "new"
var q = Person("Me");
p.sayHello();
q.sayHello();
console.log(p instanceof Person); // true
var people = ["Bob", "Will", "Mary", "Alandra"].map(Person);
// people contains array of Person objects
是的,我真的不明白为什么你试图回避构造函数方法,或者为什么他们甚至觉得需要在函数构造函数(Object.create和soon类)上添加语法糖分,而构造函数本身是一个优雅、灵活的,无论像Crockford这样的人因为不喜欢OOP而给出了多少站不住脚的理由(因为人们忘记使用新的关键字-认真的?),OOP都是完全合理的。JS是高度功能驱动的,其OOP机制也不例外。在我看来,与其躲着它,不如接受它 首先,您的观点列在“显然”下。
function Person(name){
//var name = name; //<--this might be more clear but it would be redundant
this.identifySelf = function(){ alert(name); }
}
var bob = new Person();
bob.identifySelf();