【Web】Javascript基础之原型链

来源:互联网 发布:淘宝达人推广费多少钱 编辑:程序博客网 时间:2024/05/02 06:12

一.prototype

一般函数会预设prototype属性,这个属性是一个对象。

function Foo(){    this.y=2}typeof Foo.prototype;//objectFoo.protype.x=1var obj3=new Foo();//创建一个实例,函数作为构造器使用,this将指向一个对象,对象的原型将指向构造器的prototype属性。obj3.y;//2obj3.x;//1

这里写图片描述

Foo.prototype对象内部结构 {         constructor:Foo,     __proto__:Object.prototype,      //原型,指向object.prototype,因此object的方法才能被拿来直接使用    x:1    } 

二.prototype与原型的不同

函数的prototype对象属性的作用是当使用new方法构造实例的时候,构造器的prototype属性会用作new出来的对象的原型。prototype是函数中预设的对象属性,而原型是对象上的原型。

三.原型链实现继承

function Person(name,age){this.name=name;this.age=age;//通过new创建对象时,this指向原型为Person.prototype的空对象,然后通过this.name来给其赋值。Person.prototype.hi=function(){    console.log("hi"+this.name)}//通过这种方式创建所有实例共享的方法。function Student(name,age,className){   Person.call(this,name,age);   this.className=className;}Student.prototype=Object.create(Person.prototype);//创建一个空对象,该对象的原型指向它的参数。不能用Student.prototype=Object.prototype的原因:当我们想增加一些student自己的变量会出错。Student.prototype.constructor=Student;//不设置的话,constructor会指向person}

同名方法,Student方法会覆盖Person方法。

这里写图片描述

四.动态改变prototype

Student.prototype.x=101//当动态的添加一个x的属性,所有已经创建的对象中都会新增一个x属性。Student.prototype={y:2};//直接修改,赋值为一个新对象,赋值后,结果如下:bosn.y;//undefinedbosn.x;//101//已经实例化的bosn并不会被影响。var nunnly=new Student("Nunnly");nunnly.x;//undefinednummly.y;//2//新创建的对象会受到影响。

五.instanceof

[1,2]instanceof Array===true//左侧要求是一个对象,右侧要求是一个函数。该函数将会判断右侧的prototype属性是否出现在左边对象的原型链上。

不同的window或者iframe间的对象检测不能使用instanceof

0 0
原创粉丝点击