Javascript构建对象之旅

Javascript创建对象:

1、使用一对大括号,如下形式
 
  1. var person = { 
  2.             'id':1, 
  3.             'name':'yining' , 
  4.             'get':function(){ 
  5.                 return this.id; 
  6.             } 
  7.         }; 
需要对这个对象进行扩充时,可以这样做:
 
  1. person.speak = function(language){ 
  2.                 alert(this.name+" speaks "+language); 
  3.         } 
调用:     person.speak("chinese");
但是使用这种方式时,只是简单的声明了一个变量,只有一份拷贝,因此不能使用new操作。在需要多个对象时,可以使用下面的方法。
2、使用关键字function,在Javascript中,没有Class这样的关键字,可以使用function来模拟类的创建
  1. function Person(id ,name){ 
  2.              this.id  = id; 
  3.              this.name = name; 
  4.              this.getId = function(){ 
  5.                  return this.id; 
  6.              } 
  7.          } ; 
 var person = new Person(22,'yining'); 使用new关键字产生一个Person实例person(当然你可以new多个实例),这种通过New来产生实例的方式不推荐,因为这个过程会很慢,消耗时间。当需要对这个对象进行扩展时,也可以通过
 
  1. person.speak = function(language){ 
  2.                 alert(this.name+" speaks "+language); 
  3.         } 
这种方式。

说说function关键字
 
在对象的创建过程中,多次使用了function关键字,使用function既可以创建对象,同时也是函数的声明关键字,一般来说,function有三种功能:
1、普通函数:
 
  1. function fun_name([arguments]){ 
  2.       
2、构造函数:
 
  1. function Obj_name([arguments]){ 
  2.      属性 = 属性赋值; 
  3.       ....... 
3、构造完整对象:
 
  1. function Obj_name([arguments]){ 
  2.      这里不仅包括属性也有方法; 
  3.      ....... 
注意:当function被用来做构造函数和构造对象时,对象名首字母大写。
这里是人为的强制性的将function的功能细分为3种(或许可以分得更多),实际上,在javascript中,由于函数本身就是对象(任何函数都是Function的实例,函数名只是指向这个函数的一个引用),所以函数可以有自己的属性和方法,这个弱化了函数和对象之间的区别。(如果在Java中,也提供了一个Function的类,那么所有类内部封装的方法是不是也可以作为一个对象,这才是真正的面向对象?只有这样,才能符合“一切都是对象”?)
 

对象的继承
 
在javascript中,使用对象冒充+原型链来实现对象的继承。
首先看一个例子:
 
  1. function Person(id,name){     //属性使用构造函数的形式 
  2.     this.id = id; 
  3.     this.name = name; 
  4. Person.prototype.getName = function(){     //方法使用原型 
  5.     alert(this.name); 
  6.  
  7. function Chinese(id ,name,province){ 
  8.     Person.call(this,id,name);      //对象冒充继承Person类的属性,实际上是函数call的调用 
  9.     this.province = province; 
  10. Chinese.prototype = new Person();      //用原型链继承Person类的方法,本质上是把Person类的实例赋予prototype属性。 
  11. Chinese.prototype.getProvince = function(){ 
  12.     alert(this.province); 
  13. var ch = new Chinese(1,'yining','sha\'anxi'); 
  14. ch.getProvince(); 
为什么要采取这种方式来实现继承?不是很麻烦么?这种做法的确看起来不如Java、c++中的继承来的方便,但是这的确是在多种角度权衡下最合理的方式,具体的权衡您可以去看《javascript高级程序设计》。
注意:在创建对象时,属性使用构造函数的形式,方法则采用原型的方式,这样在要多次生成实例时,可以减少开销。在实现继承时,使用BaseClass.call(this,[arguments])实现属性的继承,将BaseClass的实例赋予ChildClass.prototype属性,来实现方法的继承。
 
由于Javascript是一种动态的语言,在完成实例的创建后,可以继续为此实例进行扩展,添加函数。而在java中是不允许对实例进行扩展以及不允许对声明后的类进行修改。在Javascript中,所有的一切都可以在运行时被修改。
原文地址:https://www.cnblogs.com/benshan/p/3068860.html