JavaScript 上的 prototype this 迷惑,求解惑 分不多,谢谢

知识铺 2012-05-28 02:40:02

1 function logs(str){document.write(str+"<br />")}
2
3 //动态原型方法的精髓在于使用 prototype 声明实例方法,使用 this 声明实例属性
4 function Car(){
5 this.color = "none"; //实例实属
6 if( typeof Car._initialized == "undefined"){
7 Car.prototype.showCar = function(){ //实例方法
8 logs(this.color);
9 }
10 }
11 Car._initialized = true; //静态属性 ? 实例属性?
12 }
13 logs(Car.color); //undefined
14 logs(Car._initialized); //undefined ?
15 var ca = new Car();
16 logs(ca.color); //none
17 logs(Car._initialized); //true ?
18 logs(ca._initialized); //undefined ?
19 ca.showCar(); //none


14 17 18 行
在函数Car中 这样Car._initialized 声明的属性 这个属性到底是静态属性,还是实例属性,
如果是静态属性为什么 14行报错?
如果是实例属性 18行为什么可以? 而在声明对象ca后 17行又是对的?
...全文
240 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
likeajin 2012-06-05
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 的回复:]

showCar是类Car的静态成员 如果是的 ca.showCar(); //none 怎么可以调用成功
[/Quote]
务必要把js中的类、对象与java中的类、对象分开,他们之间只有一小部分的相似性。再者,在java中也是可以这么调用的。对象是能调用所属类的静态方法的。
知识铺 2012-06-05
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 的回复:]

麻烦管理员把3楼给删了,不好阅读。
JScript code

function logs(str){document.write(str+"<br />")}

//动态原型方法的精髓在于使用 prototype 声明实例方法,使用 this 声明实例属性
function Car(){
this.color = "none";
if( typeof Car._init……
[/Quote]
删不了。。。。

prototype定义的都是 静态成员
this.xxx 定义的都是 实例成员


showCar是类Car的静态成员 如果是的 ca.showCar(); //none 怎么可以调用成功
知识铺 2012-06-05
  • 打赏
  • 举报
回复
prototype定义的都是 静态成员
this.xxx 定义的都是 实例成员


showCar是类Car的静态成员 如果是的 ca.showCar(); //none 怎么可以调用成功
likeajin 2012-05-29
  • 打赏
  • 举报
回复
麻烦管理员把3楼给删了,不好阅读。

function logs(str){document.write(str+"<br />")}

//动态原型方法的精髓在于使用 prototype 声明实例方法,使用 this 声明实例属性
function Car(){
this.color = "none";
if( typeof Car._initialized == "undefined"){
Car.prototype.showCar = function(){
logs(this.color);
}
}
Car._initialized = true;
}
/**
* 以上代码创建了一个类Car,在js中,用函数表示类,而且函数也是一个对象。
* 该类有一个静态成员方法showCar,有一个实例成员属性color。
* 类的静态成员定义在类的原型属性--即prototype中,而类的原型属性也是一个对象。
* 类的实例成员定义在类的构造体中,即函数体内[this.xxx==]。
*
* 关于_initialized,它是给类Car定义的一个暂时性属性变量,而不是类的任何成员属性或方法。
* _initialized的作用:
* 1.每当new 一个Car对象时,就会顺序执行Car函数的每个语句。
* 2.按照操作1,如果没有_initialized这个(属性)变量的控制,每次建立Car的实例对象时都会修改类Car的prototype属性的showCar属性,即类Car的静态成员方法showCar
*/

logs(Car.color); //undefined Car是一个类(构造体函数),也是一个对象,它没有color属性。
logs(Car._initialized); //undefined ? 在new了第一个Car的实例后,Car函数体才会被执行过,而_initialized属性是在函数体内为Car加上的,所以是undefined
var ca = new Car(); //new 了第一个Car的实例对象
logs(ca.color); //none //Car实例对象ca的属性color
logs(Car._initialized); //true ?在new对象时执行了一边Car的函数体,执行完毕后Car的_initialized属性为true。
logs(ca._initialized); //undefined ?Car的实例成员和静态成员中均未定义_initialized属性,undefined。
ca.showCar(); //none
/**
* 要点:
* 1.在js中,用函数表示类,而且函数也是一个对象。
* 2.类的静态成员定义在类的原型属性--即prototype中。
* 3.类的实例成员定义在类的构造体中,即函数体内[this.xxx==]定义。

* 4.任意对象都可以为其自定义属性,包括函数对象。
* 5.针对这个例子:_initialized是函数对象(类对象)Car的一个属性;color是类Car的实例成员;showCar是类Car的静态成员;
*/
likeajin 2012-05-29
  • 打赏
  • 举报
回复

function logs(str){document.write(str+"<br />")}

//动态原型方法的精髓在于使用 prototype 声明实例方法,使用 this 声明实例属性
function Car(){
this.color = "none"; //实例实属
if( typeof Car._initialized == "undefined"){
Car.prototype.showCar = function(){ //实例方法
logs(this.color);
}
}
Car._initialized = true; //静态属性 ? 实例属性?
}
/**
* 以上代码创建了一个类Car,在js中,用函数表示类,而且函数也是一个对象。
* 该类有一个静态成员方法showCar,有一个实例成员属性color。
* 类的静态成员定义在类的原型属性--即prototype中,而类的原型属性也是一个对象。
* 类的实例成员定义在类的构造体中,即函数体内[this.xxx==]。
*
* 关于_initialized,它是给类Car定义的一个暂时性属性变量,而不是类的任何成员属性或方法。
* _initialized的作用:
* 1.每当new 一个Car对象时,就会顺序执行Car函数的每个语句。
* 2.按照操作1,如果没有_initialized这个(属性)变量的控制,每次建立Car的实例对象时都会修改类Car的prototype属性的showCar属性,即类Car的静态成员方法showCar
*/

logs(Car.color); //undefined Car是一个类(构造体函数),也是一个对象,它没有color属性。
logs(Car._initialized); //undefined ? 在new了第一个Car的实例后,Car函数体才会被执行过,而_initialized属性是在函数体内为Car加上的,所以是undefined
var ca = new Car(); //new 了第一个Car的实例对象
logs(ca.color); //none //Car实例对象ca的属性color
logs(Car._initialized); //true ?在new对象时执行了一边Car的函数体,执行完毕后Car的_initialized属性为true。
logs(ca._initialized); //undefined ?Car的实例成员和静态成员中均未定义_initialized属性,undefined。
ca.showCar(); //none
/**
* 要点:
* 1.在js中,用函数表示类,而且函数也是一个对象。
* 2.类的静态成员定义在类的原型属性--即prototype中。
* 3.类的实例成员定义在类的构造体中,即函数体内[this.xxx==]定义。

* 4.任意对象都可以为其自定义属性,包括函数对象。
* 5.针对这个例子:_initialized是函数对象(类对象)Car的一个属性;color是类Car的实例成员;showCar是类Car的静态成员;
*/
JParser 2012-05-28
  • 打赏
  • 举报
回复
上面打错了,

是你不能通过一个Cat的实例对象去访问
JParser 2012-05-28
  • 打赏
  • 举报
回复
_initialized 静态属性,你能通过一个Cat的实例对象去访问。只不过这个静态属性是在第一次实例化一个对象的时候才给赋值到Cat类上的,所以,如果没有实例化这个类的任何对象,这个属性为undefined.

87,925

社区成员

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

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