js中最重要的两条链作用域链和原型链,作用域链是从上往下,原型链是从下往上。
1.原型是什么
1)原型就是一个属性,是构造函数属性,是构造函数制造出来的对象的公共祖先,后面所有对象都会继承原型的属性和方法。
2)原型也是一个对象,所有实例对象需要共享的属性和方法都会存放在这个对象里面,不需要共享的就放在构造函数里面。
3)在默认情况下,所有原型对象都会自动获得一个constructor属性,这个属性指向prototype属性所在函数。
即 Person.prototype.constructor == Person。
2.prototype和__proto__
__prototype__ 用来查看原型,是对象的属性,可以查看但是不能修改。
prototype用来修改原型。
每个对象都有__proto__属性,但只有函数对象才有prototype属性
3.任何对象的最终原型都是Object.prototype。
4.原型链:在JavaScript中每个对象都有一个指向他的原型内部对象的内部链接,每个原型对象又有自己的原型,直到某个对象的原型为null为止,组成这条链的最后一环。
5.原型对象的作用:原型对象主要作用主要是用于继承。
6.__proto__ JS在创建对象的时候,都有一个叫做__proto__的内置对象属性,用于指向创建它的构造函数的原型对象。
7.
<script> //先定义一个构造函数 function Person(config){ this.name = config.name; this.age = config.age; this.sex = function(){ if (config.sex == 2) { return "女" }else{ return "男" } } } var obj = { name : "wang", age : 16, sex : 2, } var person1 = new Person(obj); console.log(person1) console.log(Person.prototype.constructor)//出来的是构造函数Person console.log(person1.__proto__)//person1__proto__ 和Person.prototype 是一样的 console.log(Person.prototype) console.log(person1.constructor)//构造函数Person // Person.prototype.constructor == Person; // person1.__proto__ == Person.prototype; // person1.constructor == Person;
// Person.prototype.__proto__ === Object.prototype
// Object.prototype.__proto__ === null
</script>
Object.prototype也有proto属性,但是null。因为处于原型链的顶端。
8.所有的函数构造器也都是一个普通JS独享,可以给构造器添加或者删除属性等。同时也继承了Object.prototype上的所有方法。