javascript prototype

---------------------- android培训java培训、期待与您交流!----------------------

最近在看javascript的继承 有很多不明白的地方 经过大量的查阅资料

终于有了些眉目 现在我写在这里 供大家分享

首先上代码:

// JavaScript Document
Object1 = function(name,age){
  this.name = name;
  this.age = age;
  this.println = function(){
   alert("姓名是:"+this.name+",年龄是:"+this.age);
  };
}
Object2 = function(){
};
Object2.prototype = new Object1("caodaoxi",23);
obj2 = new Object2();
obj2.println();

如果我们把Object2 = {};时obj2 = new Object2();这句话会报这个错误obj2不是一个构造方法

 

下面我来谈谈prototype这个属性的含义 不一定正确 希望大家指正

在javascript里面根本没有类这个概念 也没有方法这个概念 只有属性这个概念 继承是通过prototype这个属性实现的 prototype实际上是一个 属性包 相当于java中的map集合 形式是这样的:(key,value)  每个function都有这个属性 当我们new的时候 javascript引擎会把我们放在prototype里面的键值对放进对象中

 

 

// JavaScript Document
Object1 = function(){
  this.name = "cdx";
  this.age = 25;
  this.println = function(){
   alert("姓名是:"+this.name+",年龄是:"+this.age);
  };
}
/*Object2 = function(){
};
Object2.prototype = new Object1("caodaoxi",23);
obj2 = new Object2();
obj2.println();
*/
var ob = new Object1();
/*alert(Object1.prototype.constructor.prototype.constructor);//Object1.prototype.constructor.prototype.constructor指向和Object1.prototype.constructor指向是一样的*/
Object1.prototype.name =  "账";
alert(ob.name);

 这里打印的是cdx  这是为什么呢 ?为什么没有打印“账”呢 这里不能不说一下 javascript对象创建及访问对象属性的过程了 首先我们定义一个类时(姑且叫它类吧)在对象创建之前已经给它附加了一个prototype属性对象这个对象默认开始时是空的

当我们去new这个对象时 javascript引擎会把这个prototype里的属性copy到对象中去 当我们去访问一个对象的属性或方法时时 会先去对象里找有没有这个属性或方法 如果没有会去prototype里去查找有没有这个属性或方法

把上面程序改为:

// JavaScript Document
Object1 = function(){

  this.age = 25;
  this.println = function(){
   alert("姓名是:"+this.name+",年龄是:"+this.age);
  };
}
/*Object2 = function(){
};
Object2.prototype = new Object1("caodaoxi",23);
obj2 = new Object2();
obj2.println();
*/

/*alert(Object1.prototype.constructor.prototype.constructor);//Object1.prototype.constructor.prototype.constructor指向和Object1.prototype.constructor指向是一样的*/
Object1.prototype.name =  "账";
var ob = new Object1();
alert(ob.name);

去掉this.name="cdx"

将打印“账”

下面再来一段javascript权威指南上的一段代码吧

 Circle = function(){

        this.x = 0.1;

        this.y = 0.2;

}

new Circle();

 

Circle.prototype.pi = 3.14159;

 

// JavaScript Document
Object1 = function(){
 // this.name = "曹道喜";
  this.age = 25;
  this.println = function(){
   alert("姓名是:"+this.name+",年龄是:"+this.age);
  };
}
Object2 = function(){
};
Object2.prototype.age = 26;
Object2.prototype = new Object1();//这里类似执行这样的语句 Object2.prototype = Object1.prototype 把Object的prototype直接复制到Object1的prototype里面
//如果object2的prototype里已经有一个age属性那么object2的prototype里的age将会被object1的prototype的age给覆盖掉
object2 = new Object2();
//alert(Object2.prototype.age);//这里会打印25
//alert(object2.age);//这里会打印25 因为这时对象object2还没有age这个属性 然后javascript引擎到object2 的prototype里去找age属性
//alert(Object2.constructor);
/*
Object2.prototype = new Object1("caodaoxi",23);
obj2 = new Object2();
obj2.println();
*/

/*alert(Object1.prototype.constructor.prototype.constructor);//Object1.prototype.constructor.prototype.constructor指向和Object1.prototype.constructor指向是一样的*/
//Object1.prototype.name =  "李化龙";
//var ob = new Object1();
//ob.name = "gg";//这里等于是把 object1里放进了一个name属性 而不是放进prototype里
//alert(Object1.prototype.name);//这里打印的还是李化龙
//alert(ob.name);//如果不加ob.name = "gg";打印的就是李化龙 如果加上ob.name = "gg"; 则打印gg

/*-------------------------------第二章-------------------------*/

var s = [1,2,3,4,5]
alert(s.join());//这里并没有把s = s.join();
alert(s.constructor);//还是数组
alert(s.reverse().join());

 

 <!--StartFragment -->

<!--StartFragment -->

---------------------- android培训java培训、期待与您交流!----------------------