由买买提看人间百态

boards

本页内容为未名空间相应帖子的节选和存档,一周内的贴子最多显示50字,超过一周显示500字 访问原贴
Programming版 - 支持我的JS OOP观点的文章来了
相关主题
FP更接近人的思维clojure高手请进
FP的死穴还是性能go channel和clojure core.async哪个好
面向数据的编程与面向对象的编程Go被人吐槽了
对 (im)mutability 的误解和深度理解关于clojure
这次Clojure把Scala给干了FP是不是把OOP里面的类成员变量去掉,只剩下成员函数?
clojure和common lisp区别大么,语法上。也谈OOP跟FP之争
有人用clj写web么?比如用luminus,ring这些框架周末上点有用的信息
1st class citizenOOP里面的Object其实是actor
相关话题的讨论汇总
话题: object话题: prototype话题: private话题: 封装话题: function
进入Programming版参与讨论
1 (共1页)
p*****2
发帖数: 21240
p*****2
发帖数: 21240
2
再用functional 干掉 OO
https://gist.github.com/funkaster/2992190
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?
相关主题
clojure和common lisp区别大么,语法上。clojure高手请进
有人用clj写web么?比如用luminus,ring这些框架go channel和clojure core.async哪个好
1st class citizenGo被人吐槽了
进入Programming版参与讨论
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.

相关主题
关于clojure周末上点有用的信息
FP是不是把OOP里面的类成员变量去掉,只剩下成员函数?OOP里面的Object其实是actor
也谈OOP跟FP之争Javascript确实是最优秀的语言之一
进入Programming版参与讨论
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能并行计算啥? 图像分析?
1 (共1页)
进入Programming版参与讨论
相关主题
OOP里面的Object其实是actor这次Clojure把Scala给干了
Javascript确实是最优秀的语言之一clojure和common lisp区别大么,语法上。
唉,看来scala已经废了有人用clj写web么?比如用luminus,ring这些框架
请zhaoce大牛比较一下reactor和vert.x1st class citizen
FP更接近人的思维clojure高手请进
FP的死穴还是性能go channel和clojure core.async哪个好
面向数据的编程与面向对象的编程Go被人吐槽了
对 (im)mutability 的误解和深度理解关于clojure
相关话题的讨论汇总
话题: object话题: prototype话题: private话题: 封装话题: function