[关闭]
@moxiaojing 2016-12-29T08:10:12.000000Z 字数 2776 阅读 715

面向对象总结

面向对象 原型prototype 实例 构造器constructor 继承


1. 什么叫面向对象

a. 面向对象编程是计算机的一种编程架构。
b. 类,是一组具有相同特性和行为的对象。
c. js中没有类的概念。
d. 对象--是对类的具体实现

2. 面向对象编程的优点

提高代码的可维护性和灵活性

3. 创建一个实例

我们用 new 方法创建一个obj实例,并赋值给一个变量,方便之后的调用
```
示例
function Parent(){ 
}
var obj1 = new Parent();
var obj2 = new Parent();
```

4. 工厂模式

用函数封装以特定接口创建对象,弊端是没有办法识别一个对象的类型

5. 构造函数

任何函数,只要用new操作符来调用,那这个函数就作为构造函数,函数如果不是用new来调用,那就是普通函数。
在ECMA中函数也是对象,因此每定义一个函数,就是实例化了一个对象。
不同实例上的同名函数是不相等的。
```
function Info(userName,sex){
    this.userName = userName;
    this.sex = sex;
    this.city = "北京";
    this.coding = coding;
}
function coding(){
    console.log("我要coding");
}
var p1 = new Info("小明","男");
var p2 = new Info("小红","女");
console.log( p1.coding == p2.coding );//false
```

6. 原型prototype

我们创建的每一个函数都有一个原型(prototype)属性,这个属性是一个指针,指向一个对象,这个对象的用途是包含 可以由特定类型的所有实例 共享的属性和方法。简单来说,prototype就是通过调用构造函数而创建的那个对象实例的原型对象。
我们一般将对象实例的信息添加到原型对象上。
所有的原型对象都会自动获得一个constructor(构造器)属性,这个属性是一个指向prototype所在函数的指针。
创建了自定义的构造函数之后,其原型对象默认只会获得constructor属性,其他方法是从Object继承下来的。
浏览器中默认每个对象都有一个__proto__属性,用来连接实例与构造函数原型。

7. 理解函数中的this

函数并不具有一个固定的“this”的概念。函数只有在调用的时候this的值才会被确定下来,this的值具体是什么,要取决于调用者是以什么方式调用的
函数.call()方法,函数.apply()方法,函数.bind()方法,都可以改变this指向,区别有2点,如下
【改变this指向的同时是否调用函数】在于call和apply是在调用函数的同时改变this指向,但是bind只是改变this指向,并不会调用函数;
【传入参参数不同】call和bind的参数是一样的,第一个是this指向,之后一次是使用这个方法的函数的参数,apply传入的参数,第一个是this的指向,后面传入的是一个数组或类数组,里面的每一项一次是使用这个方法的参数

8.hasOwnProperty()方法

该方法可以判断某个属性是存在于实例中,还是存在于原型中。
方法:  
    函数.hasOwnProperty(指定属性名)
返回布尔值
    true表示该属性存在于实例中,false表示该属性存在于原型中。

9. in 方法

in方法用来判断某个属性是否存在,无论是实例中还是原型中,只要存在,就返回true

10. 继承

创建一个或多个类的专门版本类方式称为继承(Javascript只支持单继承)。 创建的专门版本的类通常叫做子类,另外的类通常叫做父类。 在Javascript中,继承通过赋予子类一个父类的实例并专门化子类来实现。在现代浏览器中你可以使用 Object.create 实现继承
  1. // 定义Person构造器
  2. function Person(firstName) {
  3. this.firstName = firstName;
  4. }
  5. // 在Person.prototype中加入方法
  6. Person.prototype.walk = function(){
  7. alert("I am walking!");
  8. };
  9. Person.prototype.sayHello = function(){
  10. alert("Hello, I'm " + this.firstName);
  11. };
  12. // 定义Student构造器
  13. function Student(firstName, subject) {
  14. // 调用父类构造器, 确保(使用Function#call)"this" 在调用过程中设置正确
  15. Person.call(this, firstName);
  16. // 初始化Student类特有属性
  17. this.subject = subject;
  18. };
  19. // 建立一个由Person.prototype继承而来的Student.prototype对象.
  20. // 注意: 常见的错误是使用 "new Person()"来建立Student.prototype.
  21. // 这样做的错误之处有很多, 最重要的一点是我们在实例化时
  22. // 不能赋予Person类任何的FirstName参数
  23. // 调用Person的正确位置如下,我们从Student中来调用它
  24. Student.prototype = Object.create(Person.prototype); // See note below
  25. // 设置"constructor" 属性指向Student
  26. Student.prototype.constructor = Student;
  27. // 更换"sayHello" 方法
  28. Student.prototype.sayHello = function(){
  29. console.log("Hello, I'm " + this.firstName + ". I'm studying " + this.subject + ".");
  30. };
  31. // 加入"sayGoodBye" 方法
  32. Student.prototype.sayGoodBye = function(){
  33. console.log("Goodbye!");
  34. };
  35. // 测试实例:
  36. var student1 = new Student("Janet", "Applied Physics");
  37. student1.sayHello(); // "Hello, I'm Janet. I'm studying Applied Physics."
  38. student1.walk(); // "I am walking!"
  39. student1.sayGoodBye(); // "Goodbye!"
  40. // Check that instanceof works correctly
  41. console.log(student1 instanceof Person); // true
  42. console.log(student1 instanceof Student); // true
添加新批注
在作者公开此批注前,只有你和作者可见。
回复批注