原型与原型链

2018-06-21  本文已影响0人  happystory

原型规则

  1. 所有的引用类型(数组、对象、函数), 都具有对象特性,即可自由扩展属性。
  2. 所有的引用类型(数组、对象、函数), 都有一个__proto__属性,属性值是一个普通对象。
  3. 所有的函数,都有一个prototype属性,属性值也是一个普通的对象。
  4. 所有的引用类型(数组、对象、函数), __proto__属性值指向它的构造函数的prototype属性值。
  5. 当试图得到一个对象的某个属性时,如果这个对象本身没有这个属性,那么会去它的__proto__(即它的构造函数的prototype)中寻找。

f instanceof Foo的判断逻辑

f__proto__一层一层往上,能否对应到Foo.prototype

判断数组

Array.isArray(arr)
Object.prototype.toString.call(arr) === "[object Array]"

描述new一个对象的过程

  1. 创建一个新对象
  2. this指向这个新对象
  3. 执行代码,即对this赋值
  4. 返回this

原型DEMO

<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <meta http-equiv="X-UA-Compatible" content="ie=edge">
  <title>Document</title>
</head>
<body>
  <div id="div1">32434</div>
  <script>
      function Elem(qs) {
        this.elem = document.querySelector(qs)
      }
    
      Elem.prototype.html = function(val) {
        var elem = this.elem
        if(val) {
          elem.innerHTML = val
          return this
        } else {
          return elem.innerHTML
        }
      }

      Elem.prototype.on = function(type, fn) {
        var elem = this.elem
        elem.addEventListener(type, fn)
      }
    
      var div1 = new Elem('#div1')
      console.log(div1.html())
      div1.html('我被改了啊').on('click', function() {
        alert('clicked')
      })
    </script>
</body>
</html>
上一篇 下一篇

猜你喜欢

热点阅读