js prototype vs this.abc = function() 是否一样?
时间:2013-05-23
来源:互联网
function ClassA()
{
this.abc = function(){}
}
ClassA.prototype.cde = function() {}
function ClassB()
{
this.ghi = function(){}
}
ClassB.prototype = new ClassA();
var b2 = new ClassB(); 之后
2 个 function 同样会 inherit ?? (即 b2 可以用到 abc 及 cde 2 个funcitons)
2 者有何本质上的分别?
[ 本帖最后由 p_net 於 2013-5-23 02:16 AM 编辑 ]
作者: p_net 发布时间: 2013-05-23
prototype 产生的 property / method 系全域性, 但可被 override.
记忆体使用方面我想都会有分别?
引用:
原帖由 p_net 於 2013-5-23 02:15 发表想 confirm 一下,
function ClassA()
{
this.abc = function(){}
}
ClassA.prototype.cde = function() {}
function ClassB()
{
this.ghi = function(){}
}
ClassB.prototype = new ClassA();
v ...
作者: a8d7e8 发布时间: 2013-05-23
引用:
原帖由 p_net 於 2013-5-23 02:15 AM 发表想 confirm 一下,
function ClassA()
{
this.abc = function(){}
}
ClassA.prototype.cde = function() {}
function ClassB()
{
this.ghi = function(){}
}
ClassB.prototype = new ClassA();
v ...
https://developer.mozilla.org/en-US/docs/JavaScript/Guide/Inheritance_and_the_prototype_chain
不过 access abc() 只有一次 prototype , cde() 是两次。
以我的理解, JavaScript 中搞 inheritance 的正确方法是用 prototype ,而非用 this.methodA = function () ... 的形式。
因为后者是每个 instance 都有一个 method 的 copy ,会花记忆体,亦影响执行速度(每次 new 时)。
前者则不会。
而正常的 OOP 中每个 class 中的 method 都是固定不变的,所以不应每 create 一个 instance 都 copy/create method 。
作者: xianrenb 发布时间: 2013-05-23
{
this.AA= 1
}
a.prototype.BB=2;
function b()
{}
b.prototype=a;
c = new a();
d = Object.create(c);
delete c.AA;
我做过实验...如果把c.AA给delete的话d.AA同样会给delete
所以说AA是同一份memory的
但如果把BB给delete...别想了...delete不到的
同样的把c.BB值修改会影响了d.BB
所以这根本c和d都完全一样

如果把d=new b();
似乎b.prototype完全起不了作用...怎试都只是undefined
但如果改b.prototype=new a();
即楼主所讲的那样
不要想了...虽然我都试过一次
这根本就在b.prototype重新造个object
另外也试过造一个全新的外部function
同时把AA和BB都set向它
然后暴力的delete了那个function...结果会怎样...???
AA和BB全都相安无事
结论就是...javascript的概念简单得很
只要是经new的话...就完整的copy
其他情况嘛...它想要copy一份就会完整的copy
不然就是完整的reference...我就不知道了
(((这说法太不负责任了
没法...全程就只有在手机做试验的...=3=
作者: cheng_chai_fung 发布时间: 2013-05-23
得到三份各自互不相干的function
作者: cheng_chai_fung 发布时间: 2013-05-23
引用:
原帖由 cheng_chai_fung 於 2013-5-23 11:08 AM 发表function a()
{
this.AA= 1
}
a.prototype.BB=2;
function b()
{}
b.prototype=a;
c = new a();
d = Object.create(c);
delete c.AA;
我做过实验...如果把c.AA给delete的话d.AA同样会给delete
所以说AA是同一份mem ...
代码:
b.prototype = a;代码:
b.prototype = new a();正确用法应是后者。
作者: xianrenb 发布时间: 2013-05-23
引用:
原帖由 xianrenb 於 2013-5-23 11:17 AM 发表要留意b.prototype = a; 与b.prototype = new a();的分别。
正确用法应是后者。
只是用上new就已经是全新物件了=3=
作者: cheng_chai_fung 发布时间: 2013-05-23
http://www.perlmonks.org/?node_id=542341
Maybe LZ can elaborate more on the problem rather than an intermediate solution?
作者: a8d7e8 发布时间: 2013-05-23
引用:
原帖由 cheng_chai_fung 於 2013-5-23 11:38 AM 发表所以就是测试过...没有方法是简单inheritance
只是用上new就已经是全新物件了=3=

在一般 OOP 中, method 都是固定不变的。
正常的去用就当然不会 delete method 了。
JavaScript 的 prototype 作用,某程度上就是 static variable/method (当然不是完全一样)。
有变动的话,所有相关“variable”都会有变化。
new 是以往的 JavaScript create prototype chain / inheritance 的唯一正确方法。
最大特点是取 prototype 为另一 object 。
这特点如你所言,产生 inheritance 时要 new 就会 run constructor function ,可能就会有 side effect 。
所以我觉得 JavaScript 的 OOP 不好用,才写了 newType.js 出来。
https://code.google.com/p/myquicknet/source/browse/src/js_special_object/newType.js
用法:
https://code.google.com/p/myquicknet/source/browse/src/js_object/com/googlecode/myquicknet/testing/TestingNSType2.js
正常的 constructor 内容就移至 _() 。
作者: xianrenb 发布时间: 2013-05-23
作者: a8d7e8 发布时间: 2013-05-23
引用:
原帖由 xianrenb 於 2013-5-23 12:12 PM 发表或许你的用法比较另类。
在一般 OOP 中, method 都是固定不变的。
正常的去用就当然不会 delete method 了。
JavaScript 的 prototype 作用,某程度上就是 static variable/method (当然不是完全一样)。
...
不过以前也写个javascript的...在大量实作object的时候的确要小心...试过因为突然太多copy搞到browser死左
作者: cheng_chai_fung 发布时间: 2013-05-23
引用:
原帖由 cheng_chai_fung 於 2013-5-23 11:08 AM 发表但如果改b.prototype=new a();
即楼主所讲的那样
不要想了...虽然我都试过一次
这根本就在b.prototype重新造个object.


据我所知, prototype 有如 function pointer, 都是指向同一东西, 应该唔系一个 copy
js 的写法有些地方几怪异, 我唔系成日写, 好多时写完,又忘了, 连 concept 都忘了, syntax 又混埋其他语言, 一堆, 都几熕
[ 本帖最后由 p_net 於 2013-5-23 11:42 PM 编辑 ]
作者: p_net 发布时间: 2013-05-23
引用:
原帖由 p_net 於 2013-5-23 11:40 PM 发表

据我所知, prototype 有如 function pointer, 都是指向同一东西, 应该唔系一个 copy
js 的写法有些地方几怪异, 我唔系成日写, 好多时写完, ...
只是一个object...所以b.prototype=new a();这里只在construct一个new object
作者: cheng_chai_fung 发布时间: 2013-05-23
作者: p_net 发布时间: 2013-05-23
引用:
原帖由 p_net 於 2013-5-23 11:50 PM 发表你个 object 是指什么? 那些 function(s)? 定是整个 a() ?
作者: cheng_chai_fung 发布时间: 2013-05-23
要同时掌握shallow copy和reference的技巧有点难度
一不小心就造了一堆明明不需要的object出来
作者: cheng_chai_fung 发布时间: 2013-05-23
引用:
原帖由 cheng_chai_fung 於 2013-5-23 11:57 PM 发表最麻烦的是没有C系的pointer
要同时掌握shallow copy和reference的技巧有点难度
一不小心就造了一堆明明不需要的object出来
function f_pointer(f123){f123();}
f_pointer(fn);
这样不就是包装了的 pointer 了吗?
作者: p_net 发布时间: 2013-05-24
引用:
原帖由 p_net 於 2013-5-24 12:17 AM 发表var fn = function(){alert("function pointer");}
function f_pointer(f123){f123();}
f_pointer(fn);
这样不就是包装了的 pointer 了吗?
作者: cheng_chai_fung 发布时间: 2013-05-24
引用:
原帖由 p_net 於 2013-5-24 12:17 AM 发表var fn = function(){alert("function pointer");}
function f_pointer(f123){f123();}
f_pointer(fn);
这样不就是包装了的 pointer 了吗?
有 pointer 就应该有 &variableA 及 *pointerA 等东西。
更加不会有 function pointer 。
或许你是想说 function 的 “reference” 。
事实上 JavaScript 中,每个 function 都是 first class object 。
可以把它当成一般 variable 来处理。
作者: xianrenb 发布时间: 2013-05-24
引用:
原帖由 xianrenb 於 2013-5-24 09:10 AM 发表JavaScript 中应该是没有 pointer 这种东西的。
有 pointer 就应该有 &variableA 及 *pointerA 等东西。
更加不会有 function pointer 。
或许你是想说 function 的 “reference” 。
事实上 JavaScript 中 ...
不过底层应该都是一个 pointer / reference 形式存在, 只是 js 己把 function 包装成一个 pointer/reference。
当然, js 无法把弄 pointer 的所有功能, 所以你说是 reference , 也有道理。
作者: p_net 发布时间: 2013-05-24
引用:
原帖由 p_net 於 2013-5-24 09:56 PM 发表好一个 first class object. 获益不少。
不过底层应该都是一个 pointer / reference 形式存在, 只是 js 己把 function 包装成一个 pointer/reference。
当然, js 无法把弄 pointer 的所有功能, 所以你说是 refe ...
然后一般的pass by value来传递
作者: cheng_chai_fung 发布时间: 2013-05-24
引用:
原帖由 cheng_chai_fung 於 2013-5-24 10:15 PM 发表以我理解...js的function都是保存为string
然后一般的pass by value来传递

作者: p_net 发布时间: 2013-05-24
引用:
原帖由 p_net 於 2013-5-24 10:35 PM 发表应该不是, 上面位老哥讲左, 系 first class object
作者: cheng_chai_fung 发布时间: 2013-05-24
引用:
原帖由 cheng_chai_fung 於 2013-5-24 10:52 PM 发表以string保存不代表不是first class object...反而更多的语言都是以string保存function...

作者: p_net 发布时间: 2013-05-24
引用:
原帖由 p_net 於 2013-5-23 02:15 AM 发表想 confirm 一下,
function ClassA()
{
this.abc = function(){}
}
ClassA.prototype.cde = function() {}
function ClassB()
{
this.ghi = function(){}
}
ClassB.prototype = new ClassA();
v ...
代码:
var __extends = this.__extends || function (d, b) {function __() { this.constructor = d; }
__.prototype = b.prototype;
d.prototype = new __();
};
var p_net;
(function (p_net) {
var ClassA = (function () {
function ClassA() { }
ClassA.prototype.abc = function () {
};
ClassA.prototype.cde = function () {
alert("cde");
};
return ClassA;
})();
p_net.ClassA = ClassA;
var ClassB = (function (_super) {
__extends(ClassB, _super);
function ClassB() {
_super.apply(this, arguments);
}
ClassB.prototype.ghi = function () {
};
return ClassB;
})(ClassA);
p_net.ClassB = ClassB;
})(p_net || (p_net = {}));
var b = new p_net.ClassB();
b.cde();
作者: dsekid 发布时间: 2013-05-25
引用:
原帖由 dsekid 於 2013-5-25 03:10 AM 发表here is another "proper" version of your javascript with namespace p_net
var __extends = this.__extends || function (d, b) {
function __() { this.constructor = d; }
__.prototype = b.pro ...
但若 child class/type 的 method 要 call parent class/type 的同名 method 时就较麻烦:要“_super”,又要“prototype”,又要“apply”/“call”。
用 newType.js 的话算是少了“prototype”一字,“_super”换成“base”,较为简洁。
而且能用“_”代替当下的 namespace ,亦可把其他 namespace 的 type import 进来,变成可直接使用简短的 type name 。
作者: xianrenb 发布时间: 2013-05-25
引用:
原帖由 dsekid 於 2013-5-25 03:10 AM 发表here is another "proper" version of your javascript with namespace p_net
var __extends = this.__extends || function (d, b) {
function __() { this.constructor = d; }
__.prototype = b.pro ...
作者: cheng_chai_fung 发布时间: 2013-05-25
热门阅读
-
office 2019专业增强版最新2021版激活秘钥/序列号/激活码推荐 附激活工具
阅读:74
-
如何安装mysql8.0
阅读:31
-
Word快速设置标题样式步骤详解
阅读:28
-
20+道必知必会的Vue面试题(附答案解析)
阅读:37
-
HTML如何制作表单
阅读:22
-
百词斩可以改天数吗?当然可以,4个步骤轻松修改天数!
阅读:31
-
ET文件格式和XLS格式文件之间如何转化?
阅读:24
-
react和vue的区别及优缺点是什么
阅读:121
-
支付宝人脸识别如何关闭?
阅读:21
-
腾讯微云怎么修改照片或视频备份路径?
阅读:28