---------------------- 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培训、期待与您交流!----------------------