原型链的形成全靠 _ proto _
- 原型和原型链是JS实现继承的一种模型
图不重要,了解完可以打开看看,欢迎指正~~~
- JS 在创建对象(不论是普通对象还是函数对象)的时候,都有一个叫做__proto__ 的内置属性,用于指向创建它的构造函数的原型对象。就是这:Person._ proto _ == Function.prototype;
对象 person1 有一个 __proto__属性,创建它的构造函数是 Person,构造函数的原型对象是 Person.prototype ,所以:
person1.proto == Person.prototype
Person.prototype.constructor == Person;
person1._proto_ == Person.prototype ;
person1.constructor == Person
以上代码多看几遍,会背!!!
构造器
Javascript 中 我们可以这样创建一个对象:
var obj = {}
它等同于下面这样:
var obj = new Object()
obj 是构造函数(Object)的一个实例。所以:
obj.constructor === Object
obj.__proto__ === Object.prototype
新对象 obj 是使用 new 操作符后跟一个构造函数来创建的。构造函数(Object)本身就是一个函数(就是上面说的函数对象),它和上面的构造函数 Person 差不多。只不过该函数是出于创建新对象的目的而定义的。
同理,可以创建对象的构造器不仅仅有 Object,也可以是 Array,Date,Function等。
所以我们也可以构造函数来创建 Array、 Date、Function
var b = new Array();
这些构造器都是函数对象:
var b = new Array();
b.constructor === Array;
b.__proto__ === Array.prototype;
console.log(typeof Array) //function
var c = new Date();
c.constructor === Date;
c.__proto__ === Date.prototype;
console.log(typeof Date) //function
var d = new Function();
d.constructor === Function;
d.__proto__ === Function.prototype
console.log(typeof Function) //function
console.log(typeof String) //function
console.log(typeof Boolean) //function 等等
1)什么是原型链?
原型链的核心就是依赖对象的_proto_的指向,当自身不存在的属性时,就一层层的扒出创建对象的构造函数,直至到Object时,就没有_proto_指向了。
2)如何分析原型链?
因为_proto_实质找的是prototype,所以我们只要找这个链条上的构造函数的prototype。其中Object.prototype是没有_proto_属性的,它==null。
3.1、最简单的原型链分析
function Person(name){
this.name = name;
}
var p = new Person();
//p ---> Person.prototype --->Object.prototype---->null
属性搜索原则:
1.当访问一个对象的成员的时候,会现在自身找有没有,如果找到直接使用。
2.如果没有找到,则去原型链指向的对象的构造函数的prototype中找,找到直接使用,没找到就返回undifined或报错。
原型继承
//原型继承的基本案例
function Person(name, age) {
this.name = name;
this.age = age;
}
//1.直接替换原型对象
var parent = {
sayHello : function() {
console.log("方式1:替换原型对象");
}
}
Person.prototype = parent;
var p = new Person("张三", 50);
p.sayHello();
//2.混入式原型继承
console.log(".............混入式原型继承..............");
function Student(name, age) {
this.name = name;
this.age = age;
}
var parent2 = {
sayHello : function() {
console.log("方式2:原型继承之混入式加载成员");
}
}
for ( var k in parent2) {
Student.prototype[k] = parent2[k];
}
var p = new Student("张三", 50);
p.sayHello();
原型链小测试
- person1._ proto _ 是什么?
- Person._ proto _ 是什么?
- Person.prototype._ proto __ 是什么?
- Object._ proto _ 是什么?
- Object.prototype_ proto _ 是什么?
答案:
第一题:
因为 person1._ proto _ = = = person1 的构造函数.prototype
因为 person1的构造函数 = = = Person
所以 person1._ proto _ = = = Person.prototype
第二题:
因为 Person._ proto _ = = = Person的构造函数.prototype
因为 Person的构造函数 = = = Function
所以 Person._ proto _ = = = Function.prototype
第三题:
Person.prototype 是一个普通对象,我们无需关注它有哪些属性,只要记住它是一个普通对象。
因为一个普通对象的构造函数 = = = Object
所以 Person.prototype._ proto _ = = = Object.prototype
第四题,参照第二题,因为 Person 和 Object 一样都是构造函数
第五题:
Object.prototype 对象也有proto属性,但它比较特殊,为 null 。因为 null 处于原型链的顶端,这个只能记住。
Object.prototype._ proto _ = = = null
转自:Yi罐可乐