原型和原型链

所有的引用类型(数组、对象、函数)都具有对象特性,即可自由扩展属性(除了'null')

例: 

1 var obj = {};
2 obj.a = 100;
3 var arr = [];
4 arr.a = 100;
5 function fn() {};
6 fn.a = 100

所有的引用类型(数组、对象、函数)多有一个__proto__属性,属性值是一个普通的对象(除了'null')

例:

1 console.log(obj.__proto__);
2 console.log(arr.__proto__);
3 console.log(fn.__proto__)

所有的函数都有一个prototype属性,属性值也是一个普通的对象

例:

1 prototype // 显式原型
2 console.log(fn.prototype)

所有的引用类型(数组、对象、函数)__proto__属性指向它的构造函数prototype属性值

例:

1 console.log(obj.__proto__ === obj.prototype)

当试图得到一个对象的某个属性,如果这个对象本身没有这个属性,那么会它的__proto__(即它的构造函数的prototype)中寻找

例:

1 console.log(obj.__proto__ === Object.prototype);
2 f.toString() // 要去f.__proto__.__proto__中查找

 原型链查询规则

 

原型链

例:

 1 // 动物
 2   function Animal() {
 3     this.eat = function() {
 4       console.log('animal eat');
 5     }
 6   }
 7   //
 8   function Dog() {
 9     this.bark = function() {
10       console.log('dog bark');
11     }
12   }
13   Dog.prototype = new Animal()
14   // 哈士奇
15   var hashiqi = new Dog()

例:

 1 function Elem(id) {
 2     this.elem = document.getElementById(id)
 3   }
 4 Elem.prototype.html = function(val) {
 5     var elem = this.elem
 6     if(val) {
 7       elem.innerHTML = val
 8       return this // 链式操作
 9     } else {
10       return elem.innerHTML
11     }
12 }
13 Elem.prototype.on = function(type, fn) {
14     var elem = this.elem
15     elem.addEventListener(ttpe, fn)
16     return this
17 }
18 var div1 = new Elem('div')
19 div1.html('<p>hello</p>').on('click', function() { alert('clicked')}).html('<p>javascript</p>')

 

posted @ 2020-11-23 22:54  治愈梦星  阅读(79)  评论(0)    收藏  举报