@moxiaojing
2016-12-29T08:10:12.000000Z
字数 2776
阅读 715
面向对象
原型prototype
实例
构造器constructor
继承
a. 面向对象编程是计算机的一种编程架构。
b. 类,是一组具有相同特性和行为的对象。
c. js中没有类的概念。
d. 对象--是对类的具体实现
提高代码的可维护性和灵活性
我们用 new 方法创建一个obj实例,并赋值给一个变量,方便之后的调用
```
示例
function Parent(){
}
var obj1 = new Parent();
var obj2 = new Parent();
```
用函数封装以特定接口创建对象,弊端是没有办法识别一个对象的类型
任何函数,只要用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
```
我们创建的每一个函数都有一个原型(prototype)属性,这个属性是一个指针,指向一个对象,这个对象的用途是包含 可以由特定类型的所有实例 共享的属性和方法。简单来说,prototype就是通过调用构造函数而创建的那个对象实例的原型对象。
我们一般将对象实例的信息添加到原型对象上。
所有的原型对象都会自动获得一个constructor(构造器)属性,这个属性是一个指向prototype所在函数的指针。
创建了自定义的构造函数之后,其原型对象默认只会获得constructor属性,其他方法是从Object继承下来的。
浏览器中默认每个对象都有一个__proto__属性,用来连接实例与构造函数原型。
函数并不具有一个固定的“this”的概念。函数只有在调用的时候this的值才会被确定下来,this的值具体是什么,要取决于调用者是以什么方式调用的
函数.call()方法,函数.apply()方法,函数.bind()方法,都可以改变this指向,区别有2点,如下
【改变this指向的同时是否调用函数】在于call和apply是在调用函数的同时改变this指向,但是bind只是改变this指向,并不会调用函数;
【传入参参数不同】call和bind的参数是一样的,第一个是this指向,之后一次是使用这个方法的函数的参数,apply传入的参数,第一个是this的指向,后面传入的是一个数组或类数组,里面的每一项一次是使用这个方法的参数
该方法可以判断某个属性是存在于实例中,还是存在于原型中。
方法:
函数.hasOwnProperty(指定属性名)
返回布尔值
true表示该属性存在于实例中,false表示该属性存在于原型中。
in方法用来判断某个属性是否存在,无论是实例中还是原型中,只要存在,就返回true
创建一个或多个类的专门版本类方式称为继承(Javascript只支持单继承)。 创建的专门版本的类通常叫做子类,另外的类通常叫做父类。 在Javascript中,继承通过赋予子类一个父类的实例并专门化子类来实现。在现代浏览器中你可以使用 Object.create 实现继承
// 定义Person构造器
function Person(firstName) {
this.firstName = firstName;
}
// 在Person.prototype中加入方法
Person.prototype.walk = function(){
alert("I am walking!");
};
Person.prototype.sayHello = function(){
alert("Hello, I'm " + this.firstName);
};
// 定义Student构造器
function Student(firstName, subject) {
// 调用父类构造器, 确保(使用Function#call)"this" 在调用过程中设置正确
Person.call(this, firstName);
// 初始化Student类特有属性
this.subject = subject;
};
// 建立一个由Person.prototype继承而来的Student.prototype对象.
// 注意: 常见的错误是使用 "new Person()"来建立Student.prototype.
// 这样做的错误之处有很多, 最重要的一点是我们在实例化时
// 不能赋予Person类任何的FirstName参数
// 调用Person的正确位置如下,我们从Student中来调用它
Student.prototype = Object.create(Person.prototype); // See note below
// 设置"constructor" 属性指向Student
Student.prototype.constructor = Student;
// 更换"sayHello" 方法
Student.prototype.sayHello = function(){
console.log("Hello, I'm " + this.firstName + ". I'm studying " + this.subject + ".");
};
// 加入"sayGoodBye" 方法
Student.prototype.sayGoodBye = function(){
console.log("Goodbye!");
};
// 测试实例:
var student1 = new Student("Janet", "Applied Physics");
student1.sayHello(); // "Hello, I'm Janet. I'm studying Applied Physics."
student1.walk(); // "I am walking!"
student1.sayGoodBye(); // "Goodbye!"
// Check that instanceof works correctly
console.log(student1 instanceof Person); // true
console.log(student1 instanceof Student); // true