原型和原型链学习(二)

原型链的形成全靠 _ proto _

  1. 原型和原型链是JS实现继承的一种模型

可以先看看这个图片
图不重要,了解完可以打开看看,欢迎指正~~~

  1. 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();

原型链小测试

  1. person1._ proto _ 是什么?
  2. Person._ proto _ 是什么?
  3. Person.prototype._ proto __ 是什么?
  4. Object._ proto _ 是什么?
  5. 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罐可乐

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值