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);
View Code

     javascript定义对象的几种方式:

    a. 直接创建对象(最常见的方式)    

1 var obj = {name:"zhangsan",sex:"male"};
2 console.log(obj.name+","obj.sex);
View Code

   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");
View Code

   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 }
View Code

   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();
View Code

   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 这样一个对象改变了该属性也会反应到其他对象当中。
View Code

   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();
View Code

   还有一种方法可以实现多个对象共享拥有的方法,就是采用动态原型创建对象,当共享的方法被创建一次后就不会创建第二次。

 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 }
View Code

二、 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();
View Code

   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(); 
View Code

   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 }
View Code

   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();
View Code

   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();
View Code

  以上就是javascript中的对象的建立及实现继承的方式,了解它们对于理解和正确书写javascript代码是非常有必要的。

    

      

posted @ 2017-06-29 16:09  守明  阅读(219)  评论(0编辑  收藏  举报