【发布时间】:2013-02-06 01:11:42
【问题描述】:
我们一直在讨论如何最好地处理我们的 JS 应用程序中的对象,研究 Stoyan Stefanov 的书,阅读关于“新”、“这个”、“原型”、闭包等的无休止的 SO 帖子。(事实上有这么多,而且他们有很多相互竞争的理论,这表明没有完全明显的答案)。
所以让我们假设我们不关心私人数据。我们满足于相信用户和开发人员不会在我们定义的方式之外乱搞对象。
考虑到这一点,这种技术有什么问题(除了它似乎违背了数十年的 OO 风格和历史)?
// 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);
显然:
- 没有什么可以阻止某人在邪恶中变异“p” 方式,或者只是 PERSON 的逻辑最终遍布各处。 (规范的“新技术”也是如此)。
- 将“p”传递给您使用的每个函数将是一个小麻烦 想用它。
- 这是一种奇怪的方法。
但是这些足够好的理由来驳回它吗?积极的一面:
- 它高效,因为(可以说)与重复函数声明的闭包相反。
- 看起来非常简单易懂,而不是摆弄 “这个”无处不在。
关键是隐私保护。我知道我会为此受到抨击,但是,寻找任何反馈。干杯。
【问题讨论】:
-
用这种方法有一个人构造函数有什么意义吗?只需使用鸭子打字
PERSON.sayHello({name: "Fred"}) -
我最喜欢的 js 方法 - 1) 使用咖啡脚本,不是万能药,而是给人一种 OO 类的错觉 - 2) 来自“JavaScript: The Good Parts” pg 52 - amazon.com/JavaScript-Good-Parts-Douglas-Crockford/dp/… 的函数式构造函数模板
-
@house9 但万灵药?类只是语法和在预编译范式中更有意义的语法。为什么人们在尝试学习 JS 时会如此沉迷于它们?理解 JS 的关键是理解 JS 函数。在那之后,构造函数是孩子的游戏。 JS 的面向对象编程方法没有任何问题。与通常与之相比的预编译语言相比,在 JS 中构建大多数面向 OOP 的模式所需的代码要少得多。
标签: javascript closures prototype