p*****2 发帖数: 21240 | |
p*****2 发帖数: 21240 | |
n****1 发帖数: 1136 | 3 一直没有找到prototype下面较好的封装方案, 网上教程大多是用function closure来
实现, 但这就意味着每个object的method都是个独立的private copy, 所以object所
占用的内存大很多。
二爷能讲讲prototype-based paradigm下面的封装么?
【在 p*****2 的大作中提到】 : 先用prototypal 干掉 classical : http://aaditmshah.github.io/why-prototypal-inheritance-matters/
|
l**********n 发帖数: 8443 | 4 prototype就是class definition. function 就是constructor, own properties就是
static properties。为什么要把method assign到object了,这样浪费内存。assign给
prototype不就得了? |
l**********n 发帖数: 8443 | 5 Every JavaScript object has an internal property called [[Prototype]]. If
you look up a property via obj.propName or obj['propName'] and the object
does not have such a property - which can be checked via obj.hasOwnProperty(
'propName') - the runtime looks up the property in the object referenced by
[[Prototype]] instead. If the prototype-object also doesn't have such a
property, its prototype is checked in turn, thus walking the original object
's prototype-chain until a match is found or its end is reached. |
p*****2 发帖数: 21240 | 6
我是个新手。我现在研究的是基本完全不用OO,用纯functional的风格去写JS代码。基
本的思路就是把object当作map,function就是function。程序就是data(map)+
function构造起来。这样的话,程序的开发,维护,测试,可读性都简单很多。我还没
有看到用OO能带来什么明显的好处,反而增加了很多复杂性。
不过你说的这个我还不太明白。你说的封装是指的data还是method呢?function
closure是封装data的吧?method的话,如果你用Object.create, method还是
prototype的copy吧?
【在 n****1 的大作中提到】 : 一直没有找到prototype下面较好的封装方案, 网上教程大多是用function closure来 : 实现, 但这就意味着每个object的method都是个独立的private copy, 所以object所 : 占用的内存大很多。 : 二爷能讲讲prototype-based paradigm下面的封装么?
|
l**********n 发帖数: 8443 | 7 there are two ways of creating an object: new Func or Object.create. I think
the Object.create is more self-explaining than new Func. |
l**********n 发帖数: 8443 | 8 instance fields is a misleading concept. properties are more natural to
think of in js. |
p*****2 发帖数: 21240 | 9
think
大牛一般用哪种?感觉应该用Object.create,而且不少文章也这么说。
【在 l**********n 的大作中提到】 : there are two ways of creating an object: new Func or Object.create. I think : the Object.create is more self-explaining than new Func.
|
l**********n 发帖数: 8443 | 10 Or you can do this Func.call(this); Or this.ctor.apply(this, argsArray);
which way you like? |
|
|
p*****2 发帖数: 21240 | 11
这两个不熟。我就是不想用OO,除非万不得已。
【在 l**********n 的大作中提到】 : Or you can do this Func.call(this); Or this.ctor.apply(this, argsArray); : which way you like?
|
l**********n 发帖数: 8443 | 12 js is dynamic which means even constructor can be changed on the fly and
reassigned. so maybe Object.create is the safest way to create an object
which is surely an instance of something. |
n****1 发帖数: 1136 | 13 那private variable藏在哪呢? prototype的method可以看到object自己的closure吗?
【在 l**********n 的大作中提到】 : prototype就是class definition. function 就是constructor, own properties就是 : static properties。为什么要把method assign到object了,这样浪费内存。assign给 : prototype不就得了?
|
l**********n 发帖数: 8443 | 14 private variable is more a convention. there is no true private variable. if
a property starts with '_', the conventionally it is considered a private
variable and should not be exposed. |
n****1 发帖数: 1136 | 15 没错, 就是用function closure来封装private data. 你可以看看
http://www.intertech.com/Blog/encapsulation-in-javascript/
FP也是需要封装的吧, 像haskell通常是在file/module级别封装, 选择export与否。
【在 p*****2 的大作中提到】 : : 这两个不熟。我就是不想用OO,除非万不得已。
|
n****1 发帖数: 1136 | 16 Closure is an expensive way to get real private variables, isn't it?
var person = function () {
var fullName = "Jason Shapiro";
var reg = new RegExp(/d+/);
return {
"setFullName" : function (newValue) {
if( reg.test(newValue) ) {
alert("Invalid Name");
}
else {
fullName = newValue;
}
},
"getFullName" : function () {
return fullName;
}
}; // end of the return
}(); // Note the '()', this means we're calling the function
// and using the *returned object,* instead of
// the function *itself* as the value of 'person.'
alert(person.getFullName()); // Jason Shapiro
person.setFullName( "Jim White" );
alert(person.getFullName()); // Jim White
person.setFullName( 42 ); // Invalid Name; the name is not changed.
person.fullName = 42; // Doesn't affect the private fullName variable.
alert(person.getFullName()); // Jim White is printed again.
if
【在 l**********n 的大作中提到】 : private variable is more a convention. there is no true private variable. if : a property starts with '_', the conventionally it is considered a private : variable and should not be exposed.
|
l**********n 发帖数: 8443 | 17 use Object.defineProperty, you can force certain property readonly or not
enumerable. |
n****1 发帖数: 1136 | 18 So you are saying that underscoring is the usual practice of encapsulation
in JS?
I know that most language do not have true private variable, even java's "
private" can be circumvented by reflection. But underscoring is not that
elegant, in particular, it will confuse the coder in an IDE with code
completion. Others will be very tempted to use them as well.
【在 l**********n 的大作中提到】 : use Object.defineProperty, you can force certain property readonly or not : enumerable.
|
p*****2 发帖数: 21240 | 19
。
像haskell通常是在file/module级别封装, 选择export与否。
这个node.js就是这么干的。
【在 n****1 的大作中提到】 : 没错, 就是用function closure来封装private data. 你可以看看 : http://www.intertech.com/Blog/encapsulation-in-javascript/ : FP也是需要封装的吧, 像haskell通常是在file/module级别封装, 选择export与否。
|
p*****2 发帖数: 21240 | 20
大牛觉得我说的JSON+function的编程模式有什么问题吗?也就是说根本不考虑什么OO
。就像C, Clojure那样去编程。现在都是JSON传来传去的,感觉没有必要封装成一个
class或者object。data就是data。
【在 n****1 的大作中提到】 : So you are saying that underscoring is the usual practice of encapsulation : in JS? : I know that most language do not have true private variable, even java's " : private" can be circumvented by reflection. But underscoring is not that : elegant, in particular, it will confuse the coder in an IDE with code : completion. Others will be very tempted to use them as well.
|
|
|
n****1 发帖数: 1136 | 21 俺就一土鳖,和大牛扯不上。 觉得JSON用来在模块间传输数据很好, 但作为object的
表达形式就把封装完全丢了。
虽然我不觉得封装是OOP的专利, 但觉得封装还是非常重要的。 高内聚低耦合这些理
念是所有良好设计的特点。 我能想到的最明显的好处:
1. 封装能保证各模块之间的界限和责任更加分明.
2. 方便代码重构. 没有啥架构一上来就是完美的,封装能把重构的损失降到最低程度.
3. 封装好的往往性能也好, 因为这样容易识别值得优化的地方。
俺不喜欢OOP是因为俺觉得它就一hype, 稍微好点新思想都被扭曲为OOP思想。 还有就
是"一切皆对象"的死板作风。 俺觉得OOP与FP最大的分歧在于mutable state, 而不是
封装(visible state)。 其实在haskell里面getter也用的很多(setter不多是因为
immutable)
OO
【在 p*****2 的大作中提到】 : : 大牛觉得我说的JSON+function的编程模式有什么问题吗?也就是说根本不考虑什么OO : 。就像C, Clojure那样去编程。现在都是JSON传来传去的,感觉没有必要封装成一个 : class或者object。data就是data。
|
p*****2 发帖数: 21240 | 22
度.
封装在Clojure里怎么体现?
mutable state也没什么大毛病吧?Clojure,Scala都开了这个口子。
【在 n****1 的大作中提到】 : 俺就一土鳖,和大牛扯不上。 觉得JSON用来在模块间传输数据很好, 但作为object的 : 表达形式就把封装完全丢了。 : 虽然我不觉得封装是OOP的专利, 但觉得封装还是非常重要的。 高内聚低耦合这些理 : 念是所有良好设计的特点。 我能想到的最明显的好处: : 1. 封装能保证各模块之间的界限和责任更加分明. : 2. 方便代码重构. 没有啥架构一上来就是完美的,封装能把重构的损失降到最低程度. : 3. 封装好的往往性能也好, 因为这样容易识别值得优化的地方。 : 俺不喜欢OOP是因为俺觉得它就一hype, 稍微好点新思想都被扭曲为OOP思想。 还有就 : 是"一切皆对象"的死板作风。 俺觉得OOP与FP最大的分歧在于mutable state, 而不是 : 封装(visible state)。 其实在haskell里面getter也用的很多(setter不多是因为
|
n****1 发帖数: 1136 | 23 记得scheme里面的encapsulation是用closure实现的, 就是我上面贴的代码。
clojure不熟
scala虽然有mutable, 但我记得它是强烈鼓励使用immutable的, 让coder意识到
referential transparent的重要性,从而减低mutable的影响面积。 从这个角度上来
说, scala是个好的开始。
scheme也有mutable, 但SICP里面可没少强调setq的危害。
但java/python/ruby/js这些基本没有这个概念, mutable state像空气一样充斥着每
一个角落, 所以到了需要高并发时就傻逼了, 就得看scala/clojure了。
【在 p*****2 的大作中提到】 : : 度. : 封装在Clojure里怎么体现? : mutable state也没什么大毛病吧?Clojure,Scala都开了这个口子。
|
p*****2 发帖数: 21240 | 24
mutable是不好,不过纯粹的immutable也有问题吧。学学FP倒是能帮助减少滥用变量。
【在 n****1 的大作中提到】 : 记得scheme里面的encapsulation是用closure实现的, 就是我上面贴的代码。 : clojure不熟 : scala虽然有mutable, 但我记得它是强烈鼓励使用immutable的, 让coder意识到 : referential transparent的重要性,从而减低mutable的影响面积。 从这个角度上来 : 说, scala是个好的开始。 : scheme也有mutable, 但SICP里面可没少强调setq的危害。 : 但java/python/ruby/js这些基本没有这个概念, mutable state像空气一样充斥着每 : 一个角落, 所以到了需要高并发时就傻逼了, 就得看scala/clojure了。
|
N******K 发帖数: 10202 | 25 scala能并行计算啥? 图像分析?
【在 n****1 的大作中提到】 : 记得scheme里面的encapsulation是用closure实现的, 就是我上面贴的代码。 : clojure不熟 : scala虽然有mutable, 但我记得它是强烈鼓励使用immutable的, 让coder意识到 : referential transparent的重要性,从而减低mutable的影响面积。 从这个角度上来 : 说, scala是个好的开始。 : scheme也有mutable, 但SICP里面可没少强调setq的危害。 : 但java/python/ruby/js这些基本没有这个概念, mutable state像空气一样充斥着每 : 一个角落, 所以到了需要高并发时就傻逼了, 就得看scala/clojure了。
|
n****1 发帖数: 1136 | 26 我错了, 应该是并发。 帖子已修改。
【在 N******K 的大作中提到】 : scala能并行计算啥? 图像分析?
|