原型与原型链

原型规则

  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>
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容