使用 this 指针和 prototype 实现 js 的 OO 时的一个区别

nchen123 2005-03-02 09:49:06
利用 this 实现的公共方法中可以访问类的私有成员(用 var 声明的变量),私有方法(用 function 直接定义的方法);
利用原型扩展实现的方法中,无法调用私有成员和变量。
例子如下所示(把其中注释掉的两行恢复就可以看到区别):

function T(name) {
this.Name = name;
var x = 5;

function privateFunc() {
alert('in private method: do sometheing');
}

this.PublicFunc = function() {
// 可以调用私有方法,访问私有成员变量。
privateFunc();
alert('x = ' + x);
alert('in public method: do something else.');
}
}

//var t = new T('t1');
//t.PublicFunc();

T.prototype.PublicFunc2 = function() {
alert('in public method 2.');
// 下面两行都会出错。在利用 prototype 扩展的方法里无法调用对象的私有方法,也访问不到通过 var 定义的私有成员。
// alert(x);
// privateFunc();
}

var t2 = new T('t2');
t2.PublicFunc();
t2.PublicFunc2();
...全文
269 20 打赏 收藏 转发到动态 举报
写回复
用AI写文章
20 条回复
切换为时间正序
请发表友善的回复…
发表回复
wjcking 2005-03-03
  • 打赏
  • 举报
回复
op
  • 打赏
  • 举报
回复
啊?你上线,咱俩翻聊天记录的
woyingjie 2005-03-02
  • 打赏
  • 举报
回复
啥时候说的?
  • 打赏
  • 举报
回复
都写成这样了看着不难受的??

我觉得编程还是大气一点儿的好,做为技术这个是一种选择方式

我跟woyingjie说过要进行面向对象的编程,是一种整体化的思想,如果太追求面向对象了又不是正道了
woyingjie 2005-03-02
  • 打赏
  • 举报
回复

x是一个变量,作用域仅在函数T()内部。

而Name是构造函数通过this关键字创建的一个对象。
潜水的鱼 2005-03-02
  • 打赏
  • 举报
回复
贴->帖;
潜水的鱼 2005-03-02
  • 打赏
  • 举报
回复
学习贴;
nchen123 2005-03-02
  • 打赏
  • 举报
回复
我的理解是:

prototype 对象相当于一个 wrapper. 他包装了你要附加的新的功能,透过接口提供给对象本身使用, 使得看上去好像是他本身的方法一样.

比如调用 t.PublicFunc2 的时候,实际上是先找 t 的函数,没找到,然后到他的 prototype 里去找,发现了,于是就调用了.但是外部看来是感觉不到这个过程的,看上去像直接调用对象本身的方法一样。

因为 prototype 下面没有老的那个函数 PublicFuc, 所以用 apply 方法调用不到.

请指正.
nchen123 2005-03-02
  • 打赏
  • 举报
回复
var col = T.prototype;
//alert(col.constructor);

for (func in col) {
alert(typeof(col[func]));
alert(col[func]);
}

输出的结果是:

function

---------------

---------------------------
Microsoft Internet Explorer
---------------------------
function() {

alert('in public method 2.');

alert(this.Name);

this.PublicFunc();

// 下面两行都会出错。在利用 prototype 扩展的方法里无法调用对象的私有方法,也访问不到通过 var 定义的私有成员。

// alert(x);

// privateFunc();

}
---------------------------
确定
---------------------------
ice_berg16 2005-03-02
  • 打赏
  • 举报
回复
我觉得在构造函数里定义局部函数的做法不好,程序的逻辑结构不完整。
meizz 2005-03-02
  • 打赏
  • 举报
回复
好象这两种模式还是有些区别的, 特别是在用 apply call 时:
T.prototype.PublicFunc2.call(); //调用正常.
T.prototype.PublicFunc.call(); //这样调用会出错.
meizz 2005-03-02
  • 打赏
  • 举报
回复
是的. 原函数原型里的局部变量, 局部函数在 prototype 都是调用不到的.
不过用 prototype 也有它的好处, 对象原型可以做得比较精小, 而后期扩展的灵活性增加
fason 2005-03-02
  • 打赏
  • 举报
回复
也没有什么好些,caller,callee等我已经不用了,他已经不是ECMA263标准,eval也是迫不得已才用.
call和apply还是比较好用方便的,能够把function直接应用于某个object上.

其实oo在js(客户端脚本)的意义上也不是很大,我只用它为站点设一个比较好的容器
nchen123 2005-03-02
  • 打赏
  • 举报
回复
"当我了解的更清楚了。" -> "让我了解的更清楚了。"
nchen123 2005-03-02
  • 打赏
  • 举报
回复
谢谢 ttyp 和阿信,当我了解的更清楚了。
阿信可以写一些关于下列问题的解释或者心得么?或者给一些参考。很是期待。

eval, prototype, constructor, call, caller, apply ...
ttyp 2005-03-02
  • 打赏
  • 举报
回复
使用原形添加的方法,其内部this不是此function内部的this,而是原形对象的this
T.prototype.dd = function()
{
alert("调用隐式:" + this.aa);
}

t.dd();
fason 2005-03-02
  • 打赏
  • 举报
回复
很早之前已经研究过了

<script>
T=(function () {
function t(name){
this.Name = name;
}
var x = 5;

function privateFunc() {
alert('in private method: do sometheing');
}

t.prototype.PublicFunc = function() {
// 可以调用私有方法,访问私有成员变量。
privateFunc();
alert('x = ' + x);
alert(this.Name)
alert('in public method: do something else.');
}
return t
})()

var a = new T('forbes');
a.PublicFunc()
</script>
ttyp 2005-03-02
  • 打赏
  • 举报
回复
我认为
this为任何对象内建的一个隐式Object类型的变量
prototype为任何对象内建的一个显式Object类型的变量

当访问对象的变量时,先在隐式变量里寻找是否有该变量,再到显式里找,带"."的赋值语句其实是给对象添加对象的简写方式,被添加的对象和原对象的私有对象有各自的作用域

<SCRIPT LANGUAGE="JavaScript">
<!--

function T()
{
var THIS = this;
var aa = "0";
this.aa = "1";
this.bb = function(){alert("内部公共AA:" +THIS.aa)}
this.cc = function(){alert("内部私有AA:" +aa)}
}

T.prototype.aa = "2";

var t = new T();

alert("调用时AA:" + t.aa);

t.aa = "3";

alert("赋值后AA:"+t.aa);


alert("原形AA:" + T.prototype.aa);

t.bb();
t.cc();

//-->
</SCRIPT>
nchen123 2005-03-02
  • 打赏
  • 举报
回复
我觉得如果想做真正有用的程序的话,这些特性的理解还是有帮助的。
nchen123 2005-03-02
  • 打赏
  • 举报
回复
只要理解了这种模式就没什么难看的了。 个人感觉还是很有用的,但是不一定有必要上升到类库的层次。

87,910

社区成员

发帖
与我相关
我的任务
社区描述
Web 开发 JavaScript
社区管理员
  • JavaScript
  • 无·法
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧