三大特征
封装
就是包装,一个值存储在一个变量中,一推重复的代码放在一个函数中,一系列属性放在一个对象中,一些功能类似的函数(方法)放在一个对象中,好多类似的对象放在一个js文件中
继承
继承是一种关系,类与类之间的关系(父类级别与类级别的关系),js中没有类, 但是可以通过构造函数的方式模拟类,然后通过原型来实线继承,继承也是为了数据共享,js中的继承也是为了实现数据共享
参考链接
- 原型链继承
- 借用构造函数继承
- 组合继承(组合原型链继承和借用构造函数继承)
- 原型式继承
- 寄生式继承
- 寄生组合式继承(常用)
多态
一个对象有不同的行为,或者同一个行为针对不同的对象,产生不同的结果,要想有多态,就要先有继承,js中可以模拟多态,但不会去使用原型
每个 实例对象 都有一个constructor属性,指向它的构造函数
原型分为隐式原型和显式原型,每个对象都有一个隐式原型,它指向自己的构造函数的显式原型 ```javascript function Person(name) { this.name = name } var person = new Person(‘Steve’) // 自定义构造函数 var string = new String(‘Hello’) // 原生的构造函数
console.log(person.constructor === Person) // true console.log(string.constructor === String) // true
每个 函数对象(包括构造函数) 都有一个 `prototype` 属性,指向函数的原型对象<br />这个 原型对象 的 `constructor` 属性,指向函数本身<br />除 `Object` 外,其它构造函数的 `prototype` 属性的 `__proto__` 属性都是指向 `Object.prototype`<br />而 `Object` 的 `prototype` 属性的 `__proto__` 属性指向 `null`<a name="MrQV7"></a># 原型链<a name="1hYDl"></a>### 原型链function是对象,function的原型`prototype`也是对象,它们都会具有对象共有的特点。即:对象具有属性`__proto__`,每个对象都会在其内部初始化一个属性,就是`__proto__`,当我们访问一个对象的属性 时,如果这个对象内部不存在这个属性,那么他就会去`__proto__`里找这个属性,这个`__proto__`又会有自己的`__proto__`,于是就这样 一直找下去,也就是我们平时所说的原型链的概念。`__proto__`可称为隐式原型,一个对象的隐式原型指向构造该对象的构造函数的原型,这也保证了实例能够访问在构造函数原型中定义的属性和方法。<a name="sTrZs"></a>### 属性访问- 当需要访问一个对象的属性时,首先从该对象开始查找,如果能够找到,那么到此返回- 如果没有找到,就在该对象的 __proto__ 属性指向的原型对象中继续查找,如果能够找到,那么到此返回- 如果没有找到,那么一直往上查找原型对象,直至 __proto__ 属性指向 null,也就是原型链的顶端- 若原型链上的所有原型对象都没有该属性,则返回 undefined```javascriptfunction Person(name) {this.name = name;}Person.prototype.getName = function () {return this.name;};var person = new Person("Steve");var name = person.getName(); // 在 Person.prototype 中找到var description = person.toString(); // 在 Object.prototype 中找到var age = person.age; // 在原型链中无法找到console.log(name); // Steveconsole.log(description); // [object Object]console.log(age); // undefined
属性检测
in 操作符:检测属性是否在对象的原型链上hasOwnProperty 方法:检测属性是否来自对象本身
