ECMAScript回归JavaScript基础(九)

主题:理解对象,创建对象。

 

小明是均等名为程序猿,也是相同长长的单身狗!他时常自嘲:每天还见面生好多目标,但可尚未女性对象!

多么痛的领悟。哈哈,目前可比盛行的编程语言都是面向对象的言语(Object-Oriented)。而我们的JavaScript也是面向对象的,尽管其比异常。JavaScript中从未像样是定义,每个对象还是基于一个援类型创建的。这个引用类型可以是眼前几乎节省说到之原生类型,也得以是开发人员自定义的种。

靶中得以出性能、方法,创建时予以一些特性值来定义对象的作为。ECMA-262将对象定义为:“无序属性的聚集,其属性可以蕴涵基本值、对象要函数”

1 var person = new Object();
2 person.name = "xuchaoi";
3 person.age = 24;
4 person.printName = function() {
5     console.log(this.name);
6 };

骨子里,我们再次爱好这样创建一个目标:

1 var person = {
2     name: "xuchaoi",
3     age: 24,
4     printName: function() {
5         console.log(this.name);
6     }
7 };

当ECMAScript5面临还为咱提供了Object.defineProperty()方法去修改对象属性默认的性状,有趣味活动了解吧,一般也为此不至!

人类总是“懒惰”的!日常中我们的先后可能会见刻画死对目标,这中即发生许多目标是大抵的。既然差不多,为什么而更写为?这样即使出现了一个概念,工厂模式!所谓工厂模式,就是同等种设计模式(废话…),抽象创建对象的长河(疑惑…)。在JavaScript中,我们透过函数来封装创建(一像样)对象的细节,这样即使可由此这函数创建很多大抵的对象啊,这个函数就如一个厂子一样(明白了…)。补充:这里见面较多之运用this,后面会独自详细的授课。这里可以先行这样明白:在全局函数中,this指为window。函数被某对象调用,函数中的this就对十分目标。匿名函数中的this指为window。

 1 function createPerson(name, age) {
 2     var person = {
 3         name: name,
 4         age: age,
 5         printName: function() {
 6             console.log(this.name); 
 7         }
 8     };
 9     return person;
10 }
11 var person1 = createPerson("xuchaoi", 24);    //*补充:person1.constructor = Object
12 var person2 = createPerson("xiaoming", 25);   //*constructor属性:构造函数。

此间运用createPerson()函数创建对象很便宜。但在一个问题,就是新来的对象的constructor属性(构造函数)都因为了Function,而不是person。打只比方的游说,函数createPerson就像一个厂房将结构person的机器关在了其中,我们鞭长莫及清楚构造机器是哪些的。为了鉴别这些机器(识别对象),出现了一个新的法子:构造函数模式。

1 function Person(name, age) {
2     this.name = name;
3     this.age = age;
4     this.printName = function() {
5         console.log(this.name);
6     }
7 } //构造函数的特点:1.函数名首字母大写;2.属性和方法赋给了this对象;3.没有return语句
8 var person1 = new Person("xuchaoi", 24);  //用构造函数创建实例时,用new这个关键字
9 var person2 = new Person("xiaoming", 25); //person2.constructor === Person  =>  true

此时,“懒惰”的人头以说了,person1和person2又创建了PersonECMAScript的printName函数…

1 person1.printName === person2.printName; // false

吓吧,那自己把构造函数中之函数单独拎出!

function Person(name, age) {
    this.name = name;
    this.age = age;
    this.printName = printName;
}
function printName() {
    console.log(this.name)
}
var person1 = new Person("xuchaoi", 24); 
var person2 = new Person("xiaoming", 25);

然完美了咔嚓! NO NO
NO,那要是构造函数中的方很多庸处置?那怎么不是全局window下有很多诸如printName()这样的函数!这样的话就丝毫从未有过封装性(很伟大上之想想)可言了。这时,便应运而生了扳平种植传说被的原型模式!

下节加以,工作喽 ─=≡Σ(((つ•̀ω•́)つ