javascript 原型链和继承(1)

javascript 原型链和继承

一切皆对象

一切都是对象,函数是第一型。
Function(F大写)和Object(O大写)都是函数的实例。
所以

Function.__proto__===Function.prototype
Object.__proto__===Function.prototype

说白了,Function是Function的实例,
Object也是Function的实例

Function instanceof Function//true
Object instanceof Function//true

同时Function也是Object的实例:

Function instanceof Object//true

一切皆对象
因为一切都是对象,所以

Function.prototype.__proto__===Object.prototype
Object.prototype.__proto__===null//true

prototype属性

对象分为函数对象和普通对象
每个函数对象都有prototype属性,但是不是所有的对象都有prototype属性.
Function.prototype包含函数特有的属性和方法,比如:apply,call:

console.log(Object.prototype); //=> {} 
console.log(Function.prototype);//=> [Function: Empty] 
console.log(String.prototype); //=> [String: ''] 
var Person=function(name){
    this.name = name;
};
Person.prototype.sayName=function(){    
        console.log(this.name); 
}
var personOne=new Person("xl");

Person 就是一个函数对象,具有prototype属性,
personOne 是一个普通对象,没有prototype属性
通过new 关键字创建的对象personOne会继承Person.prototype中的所有属性和方法
原型对象

_ _ proto _ _

所有的对象都具有_ _ proto _ _属性
任何对象的_ _ proto _ _属性都是指向构造函数的prototype对象(原型对象)

personOne.__proto__===Person.prototype;
personOne.__proto__===personOne.constructor.prototype;

当通过.或中括号来调用personOne中的方法和属性时,优先在personOne自身找,若找不到就去personOne.proto指向的原型对象上找,若找不到,则继续在
personOne.proto.proto上找,直到找到或原型对象为null.
1,通过new关键字创建的对象personOne,会自动有一个属性proto,自动指向构造函数Person的prototype对象;
2,构造函数Person的prototype对象标识了对象personOne的类型;
说白了,对象personOne的类型直接由Person的prototype对象决定;
3,对象personOne可以访问构造函数Person的prototype对象中变量和方法;
4,personOne是根据什么向上搜索的?通过proto
原型链
注意:_ _ proto _ _ 是对象的隐式属性,访问对象的属性时,并不需要加上 _ _ proto _ _

personOne.sayName();//ok
personOne.__proto__sayName();//error

Person.prototype是什么

Person.prototype 就是personOne的原型对象
原型对象至少有两个属性:constructor,proto

Person.prototype.constructor===Person;
personOne.__proto__===Person.prototype;
personOne.constructor===Person;
Person.prototype.__proto__==Object.prototype;//true

创建对象的过程

function Foo() {
}

var foo = new Foo();

我们使用new创建了构造器Foo的一个实例foo。那么这个过程究竟是怎么样的呢?它将分为以下几步,

  • 创建一个对象foo,并且foo = {}
  • 将构造器的原型链到foo的proto上,即foo.proto = Foo.prototype。这一步至关重要,为实例能够访问构造器原型方法及原型链查找等操作做好了铺垫。
  • 执行构造器Foo,并将对象foo绑定到其上下文环境中,即Foo.call(foo)。其实就是将Foo中的this指针指向foo。
    创建对象的过程
    原型对象

prototype,constructor,原型对象之间的关系

personOne的constructor就是构造函数;
personOne的原型对象就是Person.prototype;
原型对象的constructor指向构造函数,即

Person.prototype.construtor===Person;
var o={};//等价于 var o=new Object();
o.constructor===Object

所有的对象都可以通过constructor属性找到自己的构造函数.
说白了,js中的prototype相当于Java中的类,即对象的模板
java中:

Student s=new Student();//

那么s的类型就是Student;
js中

personOne.__proto__.__proto__==Object.prototype;//true

所以personOne的类型就是Object
prototype决定类型

typeof

JavaScript 有7种数据类型。主要的类型有 Number、String、Object、Function 以及 Boolean 类型,其他两种类型为 Null 和 Undefined。
typeof是通过原型对象来判断类型的,而不是通过constructor.
因为

Person.prototype.__proto__==Object.prototype

所以typeof personOne===’object’
原型对象决定对象的类型
typeof 是一元运算符,后跟变量的名称,用于获取变量的数据类型,其返回值有6个:undefined,boolean,number,string,object和function。

说明

_ _ proto _ __等价于[[Prototype]]

参考

https://segmentfault.com/a/1190000003017751

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值