原型和原型链
所有的引用类型(数组、对象、函数)都具有对象特性,即可自由扩展属性(除了'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>')

浙公网安备 33010602011771号