三大特征

封装

就是包装,一个值存储在一个变量中,一推重复的代码放在一个函数中,一系列属性放在一个对象中,一些功能类似的函数(方法)放在一个对象中,好多类似的对象放在一个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

  1. 每个 函数对象(包括构造函数) 都有一个 `prototype` 属性,指向函数的原型对象<br />这个 原型对象 `constructor` 属性,指向函数本身<br />除 `Object` 外,其它构造函数的 `prototype` 属性的 `__proto__` 属性都是指向 `Object.prototype`<br />而 `Object` `prototype` 属性的 `__proto__` 属性指向 `null`
  2. <a name="MrQV7"></a>
  3. # 原型链
  4. <a name="1hYDl"></a>
  5. ### 原型链
  6. function是对象,function的原型`prototype`也是对象,它们都会具有对象共有的特点。即:对象具有属性`__proto__`,每个对象都会在其内部初始化一个属性,就是`__proto__`,当我们访问一个对象的属性 时,如果这个对象内部不存在这个属性,那么他就会去`__proto__`里找这个属性,这个`__proto__`又会有自己的`__proto__`,于是就这样 一直找下去,也就是我们平时所说的原型链的概念。`__proto__`可称为隐式原型,一个对象的隐式原型指向构造该对象的构造函数的原型,这也保证了实例能够访问在构造函数原型中定义的属性和方法。
  7. ![](https://cdn.nlark.com/yuque/0/2021/png/12744101/1615981730904-13ed583e-efb0-454f-9612-2c83f0f2f7b3.png#height=720&id=lIZRJ&originHeight=720&originWidth=1280&originalType=binary&size=0&status=done&style=none&width=1280)
  8. <a name="sTrZs"></a>
  9. ### 属性访问
  10. - 当需要访问一个对象的属性时,首先从该对象开始查找,如果能够找到,那么到此返回
  11. - 如果没有找到,就在该对象的 __proto__ 属性指向的原型对象中继续查找,如果能够找到,那么到此返回
  12. - 如果没有找到,那么一直往上查找原型对象,直至 __proto__ 属性指向 null,也就是原型链的顶端
  13. - 若原型链上的所有原型对象都没有该属性,则返回 undefined
  14. ```javascript
  15. function Person(name) {
  16. this.name = name;
  17. }
  18. Person.prototype.getName = function () {
  19. return this.name;
  20. };
  21. var person = new Person("Steve");
  22. var name = person.getName(); // 在 Person.prototype 中找到
  23. var description = person.toString(); // 在 Object.prototype 中找到
  24. var age = person.age; // 在原型链中无法找到
  25. console.log(name); // Steve
  26. console.log(description); // [object Object]
  27. console.log(age); // undefined

属性检测

in 操作符:检测属性是否在对象的原型链上
hasOwnProperty 方法:检测属性是否来自对象本身