JavaScript原型链,javascript原型和原型链特点
本教程运行环境:windows7系统,javascript1.8.5版本1.8.5,戴尔G3电脑。
新运营商到底做了什么?其实很简单。我做了三件事。
var obj={ };
obj。_ _ proto _ _=Base.prototype
base . call(obj);在第一行中,我们创建了一个空对象obj。
在第二行中,我们将这个空对象的__proto__成员指向基本函数对象的原型成员对象。
在第三行中,我们用obj替换了基函数对象的这个指针,然后调用基函数,所以我们给obj对象赋了一个id成员变量。这个成员变量的值是“base”,关于调用函数的用法。
在讲原型链之前,我们首先要明白自定义函数和函数之间的关系是什么,构造函数、原型和实例之间的无数关系是什么?其实所有的函数都是函数的实例。构造函数上有一个prototype属性prototype,也是对象;然后原型对象上有一个构造函数属性,指向构造函数;实例对象上有一个_proto_ attribute,也指向原型对象,而且这个属性不是标准属性,所以在编程中不能使用。此属性供浏览器内部使用。
//_proto_
函数中有一个属性原型。
默认情况下,由该函数创建的对象连接到该属性。
//prototype和_ prototype的关系_
_proto_是从对象的角度。
原型是从构造者的角度。我们看图说话吧。
1、构造函数、原型和实例的关系
对象
功能对象数组
了解了这些之后,我们再来讨论什么是原型链。说白了,其实就是有限实例对象和原型之间的有限链,用来实现共享属性和继承。接下来,我们来谈谈代码。
var obj=new Object();
对象有原型对象。
原型对象也有原型对象。
obj。_proto_。_proto_。_proto_
原型对象也有原型对象。如果你继续向上看,你会发现一个空值。
//原型链示例
var arr=[];
数组.原型-对象.原型-空
var o=new Object();
o-object . prototype-null;函数Foo1(){
this.name1= 1
}
函数Foo2(){
this.name2= 2
}
foo 2 . prototype=new foo 1();
函数Foo3(){
this.name= 3
}
foo 3 . prototype=new foo 2();
var foo 3=new foo 3();
console . dir(foo 3);
然后就是继承的问题。
2、继承
1)原型继承
功能动物(名称){
this.name=name
}
功能虎(彩色){
this.color=color
}
//var tiger=新老虎(黄);
//console . log(tiger . color);
//console . log(tiger . name);//未定义
//Tiger.prototype=新动物(老虎);//一种方式
Object.prototype.name=大老虎;//第二种方式
var tiger=新老虎(黄);
console . log(tiger . color);
console . log(tiger . name);这里值得注意的主要有两个问题:给父类型传递参数不方便;父类型中的引用类型由所有实例共享。
2)ES5提供Object.create()方法实现继承。
兼容性3354——
//垫片垫圈
函数创建(对象){
if(Object.create){
返回object . create(obj);
}否则{
函数Foo(){}
Foo.prototype=obj
返回新的Foo();
}
}这个方法是ES5的新特性,其实就是拷贝继承。
3)复制继承
var obj={ };
obj.extend=function(obj){
for(对象中的变量k){
this[k]=obj[k];
}
} 4)借用构造函数继承
3354借用的构造函数中原型的成员不是借用的
功能动物(名称){
this.name=name
}
功能鼠标(昵称){
Animal.call(this, mouse );
this.nickname=昵称;
}
var=new mouse( Jerry );
console . log(m . name);
控制台. log(m . nickname);存在的问题:原型继承中传递参数的问题可以解决,但是不能继承到父类型中原型对象上的成员(属性和方法)。
5)组合遗传
——协议类型对象是动态的。
功能人(姓名){
this.name=name
}
person . prototype . showname=function(){
console . log(this . name);
}
函数学生(姓名,年龄){
Person.call(这个,名字);
this.age=年龄;
}
Student.prototype=新人();
Student.prototype.contructor=Student学生;
student . prototype . showage=function(){
console . log(this . age);
}
Var=新生(张三,12);
stu . showname();
stu . showage();【原型继承借用构造函数继承】其特点是属性的每个实例都有一个副本,方法是共享的。
【概要】套用一句很粗鲁的话,所谓原型链,是一种寻找母亲的方式,所以你可以理解为,人是母亲生的,魔是母亲生的。链条的核心其实只有一个:属性共享和独立控制。当您的对象实例需要独立的属性时,所有实践的本质都是在对象实例中创建属性。如果不考虑太多,可以直接亲自定义需要的独立属性来覆盖原型的属性。总之,在使用原型继承时,要特别注意原型中的属性,因为它们都是相关的。现在最常用的方法是组合模式。
1.原型链
1)构造函数、原型和实例之间的关系
构造函数有一个属性原型,是一个对象(Object的实例)。
原型对象prototype中有一个构造函数属性,指向原型对象所属的构造函数。
每个实例对象都有一个_proto_ attribute,同样指向构造函数的原型对象。它是非标准属性,不能用于编程,是浏览器自己使用的。
2)原型和_proto_之间的关系
原型是构造者的财产。
_proto_是实例对象的属性。
它们都指向同一个对象
【概要】I)函数也是对象,对象不一定是函数;
Ii)对象的本质:一组无序的键值对;键值对中的值可以是任何数据类型。
Iii)对象是放置(属性和方法)的容器。
3)属性搜索
(1)当你访问一个对象的成员时,你会先在对象中寻找它的存在。
如果当前对象中没有,则在构造函数的prototype对象中查找。
如果在prototype对象中没有找到,就在prototype对象的原型中寻找。
知道对象的原型为空。
2、功能
所有的函数都是函数的实例
本地对象:3354独立于宿主环境(浏览器)的对象包括对象、数组、日期、正则表达式、函数、错误、数字、字符串、布尔。
内置对象——包括Math和Global(window,是js中的全局变量),使用时不需要new。
主机对象——包括自定义对象、DOM和BOM。
【推荐学习:javascript高级教程】以上是如何理解javascript原型链的细节。更多请关注我们的其他相关文章!
郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。