ECMA-262定义的对象是什么?

面向对象(Object-Oriented,OO)的语言有一个标志,那就是他们都有类的概念,而通过类我们可以创建任意多个具有相同属性的方法和对象。[怎么理解java中类,方法,对象三者的关系]

那么在ECMA-262中呢?

 

ECMAScript中没有类的概念,因为它的对象也与基于类的语言中的对象有所不同。

ECMA-262把对象定义为:”无序属性的集合,其属性可以包含基本值,对象或者函数

这句话怎么理解呢?

[理解对象-前言]

学过c语言的人可以知道结构体,而对象就相当于结构体[c语言中结构体struct的常见方法和基础知识],亦或者我们可以把ECMAScript中的对象理解成散列表。

json

相当于定义了组名值对,其中每个名对着一个值这个值可以是函数或者数据。

[代码理解]

[1-创建Object对象实例]

 1 <script type="text/javascript">
 2     //自定义对象
 3     var person  = new  Object();
 4     person.name =  "WangQiMeng";//定义属性名:name 值:"WangQiMeng"
 5     person.age  =  "19";
 6     person.job  =  "student";
 7     person.sayName = function(){
 8         console.log(person.name);
 9     }
10 </script>

[2-字面量创建对象]:

var person = {name:"WangQiMeng",age:21,job:"student"};

[属性类型]

ES5在定义只有内部才用的attribute时候,描述了property的各种特性之所以在JavaScript中不能直接访问他们,无非是因为这些特性都是内部的,是为了实现JavaScript引擎而用的。

ForExample: [[Enumerable]]。(为了表现特性是内部值所以ECMAScript使用了两队方括号);

Ecmascript中的数据属性和访问器属性

[*创建对象*]:

我们理解了对象那么我们创建对象的时候可以使用object构造函数或者字面量的方法创建单个对象,但是这种创建方法有明显的缺点

[缺点1]:使用重复的代码创建很多对象,产生了大量重复的代码。

[缺点2]:谈何封闭性?

于是人们使用了[工厂模式]的一种变体。

{一}

[工厂模式]:

由于在JavaScript中不会出现new class所以开发人员就发明了一种函数,用函数以特定的接口创建对象的细节。

 1 <script type="text/javascript">
 2     function person(name,age,job){
 3         var o = new Object();
 4         o.name = name;
 5         o.age  = age;
 6         o.job  = job;
 7         o.sayName =  function(){
 8             console.log(this.name);
 9         }
10         return o;
11     }
12     var person1 = person("WangQiMeng",19,"student");
13     var person2 = person("WangQiMeng",19,"student");
14 </script>

 

[工厂模式-缺点]:

工厂模式虽然解决了前者(利用Object创建对象和字面量创建对象的缺点)但却没有解决对象识别的问题(怎样识别一个对象的类型)。

 

{二}

[构造函数]:

 1 <script type="text/javascript">
 2     function Person(name,age,job){
 3         this.name  = name;
 4         this.age   = age;
 5         this.job   = job;
 6         this.sayName = function(){
 7             console.log(this.name);
 8         }
 9     }
10     var person1 = new Person("Wang",19,"student");
11     var person2 = new Person("Nicholas",29,"dalao");
12 </script>

 

[注意]:

我们可以发现使用构造函数创建对象和前面使用工厂模式创建的对象有以下不同之处;

  • 没有显式的创建对象;
  • 直接将属性和方法赋给了this对象;
  • 没有return语句

【small-tip】:

构造函数的函数名首字母是大写的Person,

构造函数本身一个函数,只不过可以用来创建对象罢了。

 

[创建对象的新实例]

  1. 创建一个新对象
  2. 将构造函数的作用域赋给新对象(这个时候this就指向了这个新对象)
  3. 执行构造函数中的代码(为这个新的对象添加属性)
  4. 返回新对象

 

[构造函数-constructor属性]

利用构造函数创建的两个对象person1和person2都有一个constructor属性这个属性指向了Person

 1 <script type="text/javascript">
 2     function Person(name,age,job){
 3         this.name  = name;
 4         this.age   = age;
 5         this.job   = job;
 6         this.sayName = function(){
 7             console.log(this.name);
 8         }
 9     }
10     var person1 = new Person("Wang",19,"student");
11     var person2 = new Person("Nicholas",29,"dalao");
12     
13     alert(person1.constructor == Person);//true
14     alert(person2.constructor == Person);//true
15 </script>
View Code

[优势]

创建自定义的构造函数的优势就是将来可以将它的实例标识为一种特定的类型;这也是构造函数模式胜过工厂模式的地方。

 

{三}

[原型模式]

我们创建的每一个函数都有一个prototype(原型)属性,这个属性是一个指针,指向一个对象,而这个对象的用途就是包含可以由特定类型的所有实例共享的属性和方法。

字面理解:就是原型属性就是可以通过调用构造函数而创建的那个对象实例的原型对象。

使用原型对象我们就不必在构造函数中定义对象的实例和信息,而是可以直接将信息直接添加到原型对象中。

 1 <script type="text/javascript">
 2     function Person(){}
 3     Person.prototype.name = "WangQiMeng";
 4     Person.prototype.age  = "19";
 5     Person.prototype.job  = "student";
 6     Person.prototype.sayName = function(){
 7         console.log(this.name);
 8     };
 9     var person1 = new Person();
10     var person2 = new Person();
11     
12     person1.sayName();//WangQiMeng
13     person2.sayName();//WangQiMeng
14     alert(person1.sayName === person2.sayName);//true
15 </script>

三张图搞懂JavaScript中的原型对象和原型链

 

注:相关链接为拓展掌握(转)

                                                                                                                           --------TiL

                                                                               --------2017/12/12  

 

posted @ 2017-12-12 23:08  Lay-Buddhist  阅读(338)  评论(0)    收藏  举报