From 0699df9e101292f7a0113b05e09115f0a56f17ae Mon Sep 17 00:00:00 2001 From: qianguyihao Date: Sat, 2 Feb 2019 15:26:22 +0800 Subject: [PATCH] =?UTF-8?q?update:js=E4=B8=AD=E7=9A=84=E5=B1=9E=E6=80=A7?= =?UTF-8?q?=E5=80=BC=EF=BC=8C=E4=B9=9F=E5=8F=AF=E4=BB=A5=E6=98=AF=E4=B8=80?= =?UTF-8?q?=E4=B8=AA=E5=AF=B9=E8=B1=A1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../07-对象简介和对象的基本操作.md | 17 ++- ...构造函数和原型.md => 12-对象的创建、构造函数.md} | 116 +----------------- 2 files changed, 10 insertions(+), 123 deletions(-) rename 03-JavaScript基础/{12-对象的创建、构造函数和原型.md => 12-对象的创建、构造函数.md} (61%) diff --git a/03-JavaScript基础/07-对象简介和对象的基本操作.md b/03-JavaScript基础/07-对象简介和对象的基本操作.md index bf28564..d3a5ac8 100644 --- a/03-JavaScript基础/07-对象简介和对象的基本操作.md +++ b/03-JavaScript基础/07-对象简介和对象的基本操作.md @@ -6,7 +6,7 @@ 对象具有**特征**(属性)和**行为**(方法)。 -面向对象:可以创建自定义的类型、很好的支持继承和多态。 +面向对象:可以创建自定义的类型,很好的支持继承和多态。 面向对象的特征:封装、继承、多态。 @@ -144,19 +144,18 @@ 举例: ```javascript - var obj = new Object(); - obj.test = true; - obj.test = null; - obj.test = undefined; + //创建对象 obj1 + var obj1 = new Object(); + obj1.test = undefined; - //创建一个对象 + //创建对象 obj2 var obj2 = new Object(); obj2.name = "smyhvae"; - //将对象 obj2 设置为 obj 的属性 - obj.test = obj2; + //将整个 obj2 对象,设置为 obj1 的属性 + obj1.test = obj2; - console.log(obj.test.name); + console.log(obj1.test.name); ``` 打印结果为:smyhvae diff --git a/03-JavaScript基础/12-对象的创建、构造函数和原型.md b/03-JavaScript基础/12-对象的创建、构造函数.md similarity index 61% rename from 03-JavaScript基础/12-对象的创建、构造函数和原型.md rename to 03-JavaScript基础/12-对象的创建、构造函数.md index da7f526..fcfa4db 100644 --- a/03-JavaScript基础/12-对象的创建、构造函数和原型.md +++ b/03-JavaScript基础/12-对象的创建、构造函数.md @@ -103,6 +103,7 @@ console.log(o); }; } + // 创建一个构造函数,专门用来创建 Dog 对象 function Dog() {} var per = new Person("孙悟空", 18, "男"); @@ -165,7 +166,6 @@ console.log(o); 通过一个构造函数创建的对象,称为该类的**实例**。 - ### instanceof 使用 instanceof 可以检查**一个对象是否为一个类的实例**。 @@ -195,7 +195,7 @@ console.log(o); console.log(dog1 instanceof Object); // 所有的对象都是Object的后代。因此,打印结果为:true ``` -根据上方代码中的最后一行,需要补充一点:**所有的对象都是Object的后代,因此任何对象和Object左instanceof检查时都会返回true**。 +根据上方代码中的最后一行,需要补充一点:**所有的对象都是Object的后代,因此 `任何对象 instanceof Object` 的返回结果都是true**。 ## others @@ -251,115 +251,3 @@ json 采用 `for...in...`进行遍历,和数组的遍历方式不同。如下 ![](http://img.smyhvae.com/20180203_1518.png) - -## 类和对象 - -函数并没有创建对象的能力,类才有。 - - -```javascript -class Customer { - //属性 - public String Name; - public String Age; - public String Money; - - //方法 - public void Buy (String id,int num,double price) { - self.money -= num * price; //记录订单 - } -} -``` - - -## new一个构造函数的过程 - -- 1.开辟对内存空间,创建一个新的对象 - -- 2.**把this设置为当前对象** - -- 3.执行内部代码,设置对象属性和方法 - -- 4.返回新创建的对象 - - -## 原型对象 - -### 原型的引入 - - -```javascript - function Person(name, age, gender) { - this.name = name; - this.age = age; - this.gender = gender; - //向对象中添加一个方法 - this.sayName = function () { - console.log("我是" + this.name); - } - } - - //创建一个Person的实例 - var per = new Person("孙悟空", 18, "男"); - var per2 = new Person("猪八戒", 28, "男"); - per.sayName(); - per2.sayName(); - - console.log(per.sayName == per2.sayName); //打印结果为false -``` - -上方代码中,我们在Person中添加了一个sayName方法,然后在两个实例中进行了调用,造成的结果是:给每个实例都添加了sayName方法。 - -目前我们的sayName方法是在构造函数内部创建的,也就是说,**构造函数每执行一次就会创建一个新的sayName方法**。也是说所有实例的sayName都是唯一的,最后一行代码的打印结果为false。 - -还有一种方式是,将sayName方法在全局作用域中定义:(不建议。看注释) - -```javascript - function Person(name, age, gender) { - this.name = name; - this.age = age; - this.gender = gender; - //向对象中添加一个方法 - this.sayName = fun; - } - - //将sayName方法在全局作用域中定义 - /* - * 将函数定义在全局作用域,污染了全局作用域的命名空间 - * 而且定义在全局作用域中也很不安全 - */ - function fun() { - alert("Hello大家好,我是:" + this.name); - }; -``` - - -比较好的方式是,在原型中添加sayName方法: - -```javascript - Person.prototype.sayName = function(){ - alert("Hello大家好,我是:"+this.name); - }; -``` - -### 原型prototype的概念 - -我们所创建的每一个函数,解析器都会向函数中添加一个属性prototype。这个属性对应着一个对象,这个对象就是我们所谓的原型对象。 - -如果函数作为普通函数调用prototype没有任何作用,当函数以构造函数的形式调用时,它所创建的实例对象中都会有一个隐含的属性,指向该构造函数的原型,我们可以通过__proto__来访问该属性。 - -原型对象就相当于一个公共的区域,所有同一个类的实例都可以访问到这个原型对象,我们可以将对象中共有的内容,统一设置到原型对象中。 - -当我们访问对象的一个属性或方法时,它会先在对象自身中寻找,如果有则直接使用,如果没有则会去原型对象中寻找,如果找到则直接使用。 - -以后我们创建构造函数时,可以将这些对象共有的属性和方法,统一添加到构造函数的原型对象中,这样就不用分别为每一个对象添加,也不会影响到全局作用域,就可以使每个对象都具有这些属性和方法了。 - - -### 原型链 - -原型对象也是对象,所以它也有原型,当我们使用一个对象的属性或方法时,会现在自身中寻找,自身中如果有,则直接使用。如果没有则去原型对象中寻找。如果原型对象中有,则使用,如果没有则去原型的原型中寻找,直到找到Object对象的原型。Object对象的原型没有原型,如果在Object原型中依然没有找到,则返回undefined。 - - - - -