谢谢大家观看我的博客,接下来讲讲javascript prototype相关的内容,本人知识有限,希望有误的地方请多多指教!
prototype可以概括为几句:
prototype相当于java对象中的一个静态属性,所以每个新生成的对象都共有这个prototype属性,如果对prototype做相应的修改,新生对象--地址引用的属性(比如Array,{})都会有影响,而对于值引用的属性不会有影响(比如String,int).
实例:
function ClassA(){ }
function Pro(){
this.p1 = 'p1';
this.fun1 = function(){
console.log('fun1');
};
this.arr = [];
}
var pro = new Pro()
ClassA.prototype = pro;
var a1 = new ClassA();
var a2 = new ClassA();//a1,a2共享prototype(pro)属性
a1.p1 = 'a1p1';
console.log('a1.p1='+a1.p1+'| a2.p1='+a2.p1);//这里是值引用所以a1.p1的改变不会影响a2.p1
a1.arr.push(1,2,3);
console.log('a1.arr='+a1.arr+'| a2.arr='+a2.arr);//这里是地址引用,所以a1.arr的改变会影响a2.arr
关于constructor,我有两句话要说:1、constructor属性始终指向创建当前对象的构造函数。 2、每个函数都有一个默认的属相prototype,而这个prototype的constructor指向该函数。
//constructor属性始终指向创建当前对象的构造函数
//---每个函数都有一个默认的属性prototype,而这个prototype的constructor指向这个函数
console.log('--Example_One--');
var Person = function(name){
this.name = name;
};
Person.prototype.getName = function(){
return this.name;
}
var p = new Person('zhang');
console.log(Person.constructor === Function); //true 创建Person对象的是Function
console.log(p.constructor === Person); //true 创建p的是Person
console.log(Person.prototype.constructor === Person);//true 函数prototype的constructor指向本函数
console.log(p.constructor.prototype.constructor === Person);//true 根据上述关系得出的等式
//特殊情况如果函数prototype的引用对象被改变,上述情况将不再存在
console.log('---Example_Two---');
var Student = function(name){
this.name = name;
};
Student.prototype = {
getName:function(){
return this.name;
}
}
var s = new Student('zhen');
console.log(Student.constructor === Function );
console.log(s.constructor === Student);
console.log(Student.prototype.consturctor === Student);
console.log(s.constructor.prototype.constructor === Student);
//以上情况的解决办法
console.log('---Example_Three---');
var Animal = function(name){
this.name = name;
};
/*
Animal.prototype = {
getName:function(){
return this.name;
}
}
*/
Animal.prototype = new Object(
{
getName:function(){
return this.name;
}
}
);
Animal.prototype.constructor = Animal; //重新覆盖prototype的constructor
var a = new Animal('zhen');
console.log(Animal.constructor === Function );
console.log(a.constructor === Animal);
console.log(Animal.prototype.constructor === Animal);
console.log(a.constructor.prototype.constructor === Animal);
如有不对请大家不吝赐教!
分享到:
相关推荐
一直没弄清楚JavaScript中的prototype和constructor属性,今天看了看书,总算有点眉目了
分析javascript中 prototype __proto__ constructor之间的关系
这里有一点需要注意的是,每个函数都有一个prototype属性,这个prototype的constructor指向这个函数,这个时候我们修改这个函数的prototype时,就发生了意外。如 function Person(name,age){ this.name = name; ...
JavaScript的constructor属性[文].pdf
主要介绍了JavaScript中constructor()方法的使用简介,是JS入门学习中的基础知识,需要的朋友可以参考下
JS:typeof instanceof constructor prototype区别
在javascript中,prototype、constructor以及__proto__之间有着“著名”的剪不断理还乱的三角关系,楼主就着自己对它们的浅显认识,来粗略地理理以备忘,有不对之处还望斧正。
1、任何一个函数内都有prototype属性,这个prototype属性指向另一个对象 ,这个对象就是就是原型对象 ,简称原型。注意这个prototype是函数本身所自带的属性 2、原型的作用就是实现方法共享,将多个对象会调用的相同...
this表示当前对象,如果在全局作用范围内使用this,则指代当前页面对象window,prototype本质上还是一个JavaScript对象,constructor始终指向创建当前对象的构造函数
真正的原因是:一个对象的constructor是它的构造函数的prototype.constructor,而每一个函数都有一个prototype,默认情况下,这个prototype有一个constructor属性,指向的是它自己。 我觉得Javascript的设计本意是让...
深化浅析JavaScript中的constructor_.docx
对象的constructor属性用于返回创建该对象的函数,也就是我们常说的构造函数,除了创建对象,构造函数(constructor) 还做了另一件有用的事情—自动为创建的新对象设置了原型对象(prototype object)
javascript设计模式Constructor(构造器)模式.docx
constructor 属性返回对创建此对象的数组函数的引用。本文给大家介绍JavaScript中的constructor ,需要的朋友参考下吧
javascript new后的constructor属性.docx
foo.prototype.constructor=function foo() 动物B(function function()), 动物B的模板描述 . B.模板 (function.prototype), B.模板有个构造方法 function.prototype.constructor=function function() 狗C= new 狗类...
在javascript的使用过程中,constructor 和prototype这两个概念是相当重要的,深入的理解这两个概念对理解js的一些核心概念非常的重要