javascript中的对象与继承
看过java之后再来看javascript,发现其中有太多相似之处,实际看去明明相似却又个性鲜明。现在就来总结下javascript中的对象与继承关系。
一、javascript对象
在javascript中没有类这一概念,只有对象,所有的对象都是从Object对象继承过来的。在javascript中对象的属性可以动态添加 ,也可以动态删除,它不想java中的类,定义好的属性就不会改变。
1 var obj = new Object(); 2 // 两种方式定义obj属性name 3 // obj["name"] = "zhangsan"; 4 obj.name = "zhangsan"; 5 console.log(obj.name); 6 // 删除obj对象中的name属性 7 delete obj.name; 8 console.log(obj.name);
javascript定义对象的几种方式:
a. 直接创建对象(最常见的方式)
1 var obj = {name:"zhangsan",sex:"male"}; 2 console.log(obj.name+","obj.sex);
b. 基于已有对象扩充其属性和方法
1 var obj = new Object(); 2 obj.name = "zhangsan"; 3 obj.sayName = function(name){ 4 this.name = name; 5 console.log(this.name); 6 } 7 obj.sayName("lisi");
c. 基于工厂模式创建对象
1 function createObj(username,password){ 2 var obj = new Object(); 3 obj.username = username; 4 obj.password = password; 5 obj.get = function(){ 6 alert(this.username + " "+this.password); 7 } 8 return obj; 9 } 10 // 每创建一个对象就会创建一个get函数,占内存 11 var obj1 = createObj("zhangsan","123"); 12 13 // 多个对象调用一个函数,将函数单独写出来,将对象的引用指向它 14 function get(){ 15 alert(this.username + " "+ this.password); 16 } 17 18 function createObj(username,password){ 19 var obj = new Object(); 20 obj.username = username; 21 obj.password = password; 22 obj.get = get; 23 }
d. 构造函数方式创建对象
1 function Person(username,password){ 2 // 在执行第一行代码,js引擎就会为我们创建一个对象 3 this.username = username; 4 this.password = password; 5 this.getInfo = fucntion(){ 6 console.log(this.username+ ", " +this.password); 7 } 8 // 此处隐藏一个return语句,用于将之前生成的对象返回 9 } 10 var p1 = new Person("zhangsan",123); 11 p1.getInfo();
e. 原型方式创建对象
单纯使用原型方式定义对象无法在构造函数中为属性赋值,只能在 对象生成后再去改变属性值。
1 function Person(){} 2 3 Person.prototype.username = "zhangsan"; 4 Person.prototype.password = "123"; 5 Person.prototype.getInfo = fucntion(){ 6 alert(this.username +", " this.password); 7 } 8 9 //如果使用原型方式对象,那么生成的所有对象会共享原型中的属性, 10 这样一个对象改变了该属性也会反应到其他对象当中。
f. 使用构造函数+原型方式创建对象
使用这种方式创建对象会保证多个对象之间共享拥有的方法,但其属性互不干扰
1 function Person(username,password){ 2 this.username = username; 3 this.password = password; 4 } 5 6 Person.prototype.getInfo = function(){ 7 alert(this.name+", " +this.password); 8 } 9 10 var p1 = new Person("zhangsan",123); 11 var p2 = new Person("lisi",456); 12 p1.getInfo(); 13 p2.getInfo();
还有一种方法可以实现多个对象共享拥有的方法,就是采用动态原型创建对象,当共享的方法被创建一次后就不会创建第二次。
1 function Person(name,password){ 2 this.name = name; 3 this.password = password; 4 if(typeof Person.flag == "undefined"){ 5 Person.prototype.getInfo = function(){ 6 alert(this.name + "," this.password); 7 } 8 Person.flag = true; 9 } 10 11 }
二、 javascript对象间的继承
a. 采用对象冒充的方式进行继承
1 function Parent(username){ 2 this.username = username; 3 this.sayHello = function(){ 4 console.log(this.username); 5 } 6 } 7 8 function Child(username,password){ 9 // 下面三行为关键代码 10 this.method = Parent; 11 this.method(username); 12 delete this.method; 13 14 this.password = password; 15 this.sayWorld = function(){ 16 console.log(this.password); 17 } 18 } 19 20 var p = new Parent("zhangsan"); 21 var c = new Child("lisi",123); 22 p.sayHello(); 23 c.sayHello(); 24 c.sayWorld();
b. 采用call方法方式实现继承
call 方法是 Function 对象中的方法,因此我们定义的每个函数都拥有该方法。可以通过函数名来调用 call 方法,call 方法的第一个参数会被传递给函数中的 this,从第 2 个参数开始,逐一赋值给函数中的参数。
1 function Parent(username){ 2 this.username = username; 3 this.sayHello = function(){ 4 console.log(this.username); 5 } 6 } 7 function Child(username,password){ 8 Parent.call(this,username); 9 this.password = password; 10 this.sayHello = function(){ 11 console.log(this.password); 12 } 13 } 14 var p = new Parent("zhangsan"); 15 var c = new Child("lisi",123); 16 p.sayHello(); 17 c.sayHello(); 18 c.sayWorld();
c. 采用apply方法方式实现继承
apply方法是 Function 对象中的方法,因此我们定义的每个函数都拥有该方法。可以通过函数名来调用 apply 法,apply 方法的第一个参数会被传递给函数中的 this,与call方法不同的是,apply方法是将参数作为一个数组传给函数。
1 function Parent(username){ 2 this.username = username; 3 this.sayHello = function(){ 4 console.log(this.username); 5 } 6 } 7 function Child(username,password){ 8 Parent.apply(this,new Array(username)); 9 this.password = password; 10 this.sayHello = function(){ 11 console.log(this.password); 12 } 13 }
d. 使用原型链方式实现继承
使用这种方式的缺点是无法传参。
1 function Parent(){} 2 3 Parent.prototype.hello = hello; 4 Parent.prototype.sayHello = function(){ 5 console.log(this.hello); 6 } 7 8 function Child(){} 9 Child.prototype = new Parent(); 10 Child.prototype.world = world; 11 Child.prototype.sayWorld = function(){ 12 console.log(this.world); 13 } 14 15 var c = new Child(); 16 c.sayHello(); 17 c.sayWorld();
e. 使用构造函数+原型链的混合方式实现继承(推荐使用)
1 function Parent(username){ 2 this.username = username; 3 } 4 Parent.prototype.sayHello = function(){ 5 console.log(this.username); 6 } 7 8 function Child(username,password){ 9 // 属性继承 10 Parent.call(this,username); 11 this.password = password; 12 } 13 // 方法继承 14 Child.prototype = new Parent(); 15 Child.prototype.sayWorld = function(){ 16 console.log(this.password); 17 } 18 19 var c = new Child("zhangsan",123); 20 c.sayHello(); 21 c.sayWorld();
以上就是javascript中的对象的建立及实现继承的方式,了解它们对于理解和正确书写javascript代码是非常有必要的。