一.原型链指针(__prototype__)的特色浏览器
1.原型对象(prototype): (本质是一个对象,每个函数在建立函数时,都是由Function这个对象产生一个原型对象,而后经过指针的方式赋给对象)是函数对象的一个内部属性,值是一个简单的对象,用户能够访问,操做 该对象,能够向原型对象里面添加属性、方法。函数
2.原型链(__proto__): 每一个对象都具有的,不可访问的内部属性(指针)(chorm等浏览器能够访问,但没法操做),指针指向 构造函数 对应的原型对象。(开发人员不能动);每建立一个对象,执行了一次构造函数spa
,有一个指针指向原型对象。prototype
3.原型链的特色:指针
原型链的终点是 Object对象 的 prototype 属性,该属性的 __proto__为null , 全部的连接构成原型链。orm
原型链是一个从头至尾连接的闭环。对象
原型链的做用:继承
使用原型链能够模拟类的功能。内存
使用原型链能够实现继承关系。原型链
二.原型对象(prototype)的建立:
在预编译或执行匿名函数时,由JS引擎调用 new Function( ) 建立函数对象,以及函数对象的 prototype 对象。只有函数对象才有 prototype 属性。
function Fun(){ //函数在JS中也是对象
}
//function fun() 以上代码,在预编译阶段至关于下面一句
var Fun =new Function(); //这句代码就是 function fun()的过程
栈内存中,在预编译阶段已经存在 Object Function, 首字母大写
Object . toString(); //返回函数定义和函数体
Object : function Object( ); //一个function对象
Function: function Object( ); //一个function对象
在程序加载前,内存中已经存在
function Object(){
}
function Function(){
}
在预编译阶段至关于定义了两个变量
var Object = new Function(); //Object是一个特殊的浏览器本身建立的构造函数
var Function = new Function() ;//两个 Function 左侧和右侧的Function相同
在预编译阶段,会加载两个构造函数 Object : 特殊函数,表明对象函数 Function : 函数对象,自省的(本身调用本身建立本身) var Function = new Function()
下一个问题
1. var obj = { //全局变量1 实际值为 object
name : "ads";
}
2. var obj =new Object(); obj.name="ads";
1. 和 2. 两个程序是同样的
任何一个对象都有原型链属性,只有函数对象有原型属性.
Object.prototype 的原型链 的原型指针指针是最终点。为空,全部对象均可以访问Object.prototype内的方法
Function.prototypre = new Object();
原型链的内部结构,链接方式
prototype 不起到原型链的做用,是指向原型对象的一个指针。__proto__:将原型链链接起来
三.原型对象(prototype)的默认属性(不要对prototype直赋值,会覆盖默认属性,致使原型链错误)
function Fun(){ //函数在JS中也是对象
}
debgger;
这里Fun原型对象中有两个属性 Fun.prototype : Object constructor :function Fun( ) __proto__ : Object
Fun.prototype = {
name = 'zhang',
age:11
}
由于从新对原型对象赋值, Fun.prototype : Object age : 11 name : "张三“ __proto__ : Object constructor不见了
1. __proto__:prototype对象的原型链。
2.constructor:构造器指针,指向构造函数对象。
四. 修改原型对象的属性:
Fun.prototype.attribute = value; //扩展属性
Fun.prototype.FunName = function(){} ; // 扩展函数
修改范例
Fun.prototype.name="zhang";
Fun.prototype.sayhello = function(){
console.log("hello");
}
至关于在
Fun.prototype{
name : ”张三“,
sayhello :function
}
function Fun(){ //函数在JS中也是对象
}
Fun.prototype.name="zhang";
Fun.prototype.sayhello = function(){
console.log("hello");
}
var fun =new Fun();
var fun1 =new Fun();
fun.sayhello(); //至关于继承 原型链指针指向构造函数的原型对象
fun1.sayhello( ) ;也能够 都是继承构造函数的方法,属性
Fun.prototype{ / /fun的原型对象
__proto__ : null ;
constructor; //指向他的构造函数,谁建立他指向谁 指向谁 Fun()
}
Fun :new Function{
prototype :
_proto__ ;
}
constructor不影响原型链,做用,在原型对象(prototype)中能够访问构造函数,只有prototype属性中有constructor,其他对象没有。
扩展原型对象可扩展函数的方法。
五。原型链指针(__prototype__)的特色
1.不可访问性:在IE等浏览器__protoype__属性不可访问。
2.不可操做性,不能修改原型链指针的指向 Fun.__proto__= //不能够这样写
3.多元性:全部对象类型,(包括Function)都包含原型链指针。
4.链接性:对象的原型链指针默认指向 构造函数 的prototype对象。但 prototype 对象的 __proto__ 也会做为原型链的一部分,直到链接到Object 的 prototype 对象。object原型对象中__proto__为null
5.通用性:在原型链上全部的 prototype 对象中的属性和函数,对象均可以访问调用。
6.检测上级原型链的方式:
instanceof 例如: Fun instanceof Function //true
fun instanceof Fun //true fun是由Fun建立出的, Fun的原型链在 fun以前(上).
Function instanceof Object //true
Fun.prototype . isPrototypeOf (fun) //检测Fun的prototype是不是 fun 原型链上的一环 (此方法来自 Object的prototype 扩展 true, 只能检测 紧接着的两个原型链指针,fun指向 Fun的prototype