复制代码 代码如下:
<script> Function.prototype.createInstance = function(){
var T = function(){};
T.prototype = this.prototype;
T.constructor = this;
var o = new T();
this.apply(o, arguments);
return o;
}</script>
说下上面代码里面 T.constructor = this这句话,我感觉这句话没有什么实际作用,
本身T.constructor应该是为Funtion,为什么要给它设定为Funtion的实例呢,
复制代码 代码如下:
<script>
Function.prototype.$extends = function(p){
this.$super = p;
var fn = function(){};
fn.prototype = p.prototype;
this.prototype = new fn();
//这句是我自己加的,保证构造出子类实例的constructor依然指向子类的构造器函数
this.prototype.constructor=this;
//-----------------------------
return this;
};
function Animal(){
}
function Cat(){
}
Cat.$extends(Animal);
var bb=new Cat();
alert(bb.constructor);
//但是(this.prototype.constructor=this)这种做法通过bb这个对象无法回朔到Animal的原型
//下面语句依然返回Cat这个函数,而不是Animal
alert(bb.constructor.prototype.constructor)
</script>
还有上面这句代码,我自己加了1句,修正了子类构造器依然指向子类函数,但是对象的原型链的回朔不能到达父类原型,解决办法是
去掉this.prototype.constructor=this;既不给原型设置constructor属性,而是给实例设置一个constructor属性,如下代码
复制代码 代码如下:
<script>
Function.prototype.$extends = function(p){
this.$super = p;
var fn = function(){};
fn.prototype = p.prototype;
this.prototype = new fn();
return this;
};
function Animal(){
}
function Cat(){
this.constructor= arguments.callee;
}
Cat.$extends(Animal);
var bb=new Cat();
alert(bb.constructor);
//这种做法可以通过bb这个对象回朔到Animal的原型
alert(bb.constructor.prototype.constructor)
</script>
最后分析下constructor的实际作用
复制代码 代码如下:
<script>
//定义函数
var f=function(){
}
//这里显示true,因为f的构造器是Funtion,f内部的原型属性_proto_被赋值为构造器的prototype也就是Function的prototype
//instanceof检查f内部的_proto_是否与Function.prototype有共同的结点,如果有则返回true
alert(f instanceof Function)
//obj是f的实例
var obj=new f;
//obj内部的原型属性_proto_在new f时被赋值为f.prototype,显然f.prototype与Function.prototype没有共同的结点,因此显示false
alert(obj instanceof Function)
//为了让obj成为Function的实例也就是(obj instanceof Function)显示true
//只需要f.prototype=Function.prototype
f.prototype=Function.prototype;
//但是我不推荐上面这种做法,因为对f.prototype的修改会破坏了Function.prototype,例如f.prototype.name="51js"会给Function的原型也加上1个name属性
//正确的做法应该是下面这样,这样诸如f.prototype.name的修改就不会破坏Function的原型了
f.prototype=new Function();
f.prototype.name="zhouyang";
/**关键是这里,再次调整constructor属性为f,维护constructor这种做法是为了保证obj能够正确回朔原型链,
*假如我们要获取obj内部的原型链,但只知道obj,不知道obj是怎么实例化来的,由于obj内部的_proto_属性不可见,那么我们要获取obj内部原形只能通过obj.constructor来获取构造器,然后再获取构造器的prototype
*1.如果我们加下面这句(f.prototype.constructor=f),回朔obj原型链
*只能回朔1层原型链也就是obj.constructor.prototype(子类原型)-->obj.constructor.prototype.constructor.prototype(依然是子类原型),这样只能回朔1层原型链
**/
f.prototype.constructor=f;
obj=new f;
alert("找到子类了---"+obj.constructor+"\n"
+"找到的还是子类,无法找到父类---"+obj.constructor.prototype.constructor)
alert(obj instanceof Function)
/**2.如果我们用下面的方法在f定义里设置f的实例的constructor,而不是f原型的constructor
*就可以回朔2层原型链也就是 obj.constructor.prototype(子类原型)-->obj.constructor.prototype.constructor.prototype(父类原型)
*显然这种情况是符合对象原型继承链的情况的
*/
f=function(){
this.constructor=arguments.callee;
}
f.prototype=new Function();
f.prototype.name="zhouyang";
obj=new f;
alert("找到子类了---"+obj.constructor+"\n"
+"找到父类了---"+obj.constructor.prototype.constructor)
alert(obj instanceof Function)
</script>
复制代码 代码如下:
<script>
//定义函数
var f=function(){
}
//这里显示true,因为f的构造器是Funtion,f内部的原型属性_proto_被赋值为构造器的prototype也就是Function的prototype
//instanceof检查f内部的_proto_是否与Function.prototype有共同的结点,如果有则返回true
alert(f instanceof Function)
//obj是f的实例
var obj=new f;
//obj内部的原型属性_proto_在new f时被赋值为f.prototype,显然f.prototype与Function.prototype没有共同的结点,因此显示false
alert(obj instanceof Function)
//为了让obj成为Function的实例也就是(obj instanceof Function)显示true
//只需要f.prototype=Function.prototype
f.prototype=Function.prototype;
//但是我不推荐上面这种做法,因为对f.prototype的修改会破坏了Function.prototype,例如f.prototype.name="51js"会给Function的原型也加上1个name属性
//正确的做法应该是下面这样,这样诸如f.prototype.name的修改就不会破坏Function的原型了
f.prototype=new Function();
f.prototype.name="zhouyang";
/**关键是这里,再次调整constructor属性为f,维护constructor这种做法是为了保证obj能够正确回朔原型链,
*假如我们要获取obj内部的原型链,但只知道obj,不知道obj是怎么实例化来的,由于obj内部的_proto_属性不可见,那么我们要获取obj内部原形只能通过obj.constructor来获取构造器,然后再获取构造器的prototype
*1.如果我们加下面这句(f.prototype.constructor=f),回朔obj原型链
*只能回朔1层原型链也就是obj.constructor.prototype(子类原型)-->obj.constructor.prototype.constructor.prototype(依然是子类原型),这样只能回朔1层原型链
**/
f.prototype.constructor=f;
obj=new f;
alert("找到子类了---"+obj.constructor+"\n"
+"找到的还是子类,无法找到父类---"+obj.constructor.prototype.constructor)
alert(obj instanceof Function)
/**2.如果我们用下面的方法在f定义里设置f的实例的constructor,而不是f原型的constructor
*就可以回朔2层原型链也就是 obj.constructor.prototype(子类原型)-->obj.constructor.prototype.constructor.prototype(父类原型)
*显然这种情况是符合对象原型继承链的情况的
*/
f=function(){
this.constructor=arguments.callee;
}
f.prototype=new Function();
f.prototype.name="zhouyang";
obj=new f;
alert("找到子类了---"+obj.constructor+"\n"
+"找到父类了---"+obj.constructor.prototype.constructor)
alert(obj instanceof Function)
</script>结论constructor的作用就是维护对象的原型链
向果果和winter赐教一下,不知理解的是否正确哈,另外我看大家常说的原型的污染到底指的是什么??
作用的话下面这个或许可以说明
复制代码 代码如下:
<script>
var f = function(x){}
f.prototype={};
alert((new f).constructor);
f.prototype.constructor=f;
alert((new f).constructor);
</script>
相关推荐:
SEO站在未来之巅,助力网站在激烈竞争中脱颖而出,推荐网站优化欢迎咨询
互联网留痕:数字时代的隐形轨迹与自我管理,灯塔网站推广包年多少钱
SEO未来:如何在变革中抢占先机,迎接数字营销的新纪元,台州网站建设分析和总结
用AI写文章:效率与创意的完美结合
用AI写一篇文章,如何提升你的写作效率与创意
文章疑似AI生成怎么办?如何辨别并应对AI生成文章的挑战
SEO自行:提升网站流量的秘密武器,邹平县个人网站建设建议
SEO搜索关键词是什么意思?让你轻松网站流量的秘密!,ai颜色不对
seo网站关键字排名优化,网站seo关键词 ,运动ai
ChatGPT破解版:让人工智能助力你的工作与生活,ai cos帽
SEO要点:提升网站排名的核心技巧与策略,福田市网站建设推广费用
SEO很多,如何在竞争激烈的市场中脱颖而出?,在SEO优化中
SEO优化快:如何在短时间内实现网站流量爆发,Lacey0508ai
ChatGPT网络故障报告从协调世界时(UTC)晚上1107左右开始激增,15分钟内引发广泛关注,ai无视进化
SEO优化需要给网站做哪些优化工作?,ai捕捉火苗
什么是seo伪原创,seo就业前景伪原创怎么写 ,头像ai画怎么弄
怎么用AI生成一篇文章?高效创作指南全揭秘!
SEO导航:助力网站提升流量与排名的必备工具,荣昌建筑网站建设
seo资源是什么意思,seo资源怎么打开 ,梅州ai自动插件加工
seo链接锚是什么,什么是锚链接,如何设置锚链接 ,保山智能AI
打造内容创作新高度:文章扩写AI的革命性优势
GPT怎么收费?揭秘AI技术的定价与价值,ai报考高考
ChatGPT常见问题汇总:解答你关于AI的一切疑惑,松鼠ai智能教适应教育
AI仿写文章:开启内容创作新纪元
怎么用AI生成文章免费版,高效创作从此开始!
seo经理做什么的,seo经理招聘 ,盲人ai眼镜
ChatGPT使用问题?如果您正在使用VPN,请尝试将其关闭,ai制作渐变立体
SEO在线服务-让您的网站快速跃升至搜索引擎前列,江西小红书营销推广案例
优化综合:引领高效发展的智慧之道,电影营销的推广方式
ZBlog:开启你的个人网站新时代,轻松搭建与管理,二手手机营销推广方案
seo需要什么人员,seo需要什么技能 ,画大学ai
SEO自己:打造属于你的数字营销利器,微信裂变营销推广软件
SEO优化引导新官网,助力企业迈向成功之路,宋轶ai换
专业SEO助力企业在激烈市场竞争中脱颖而出,嘉兴海外网站推广价格
SEO售产-数字营销新战场,助力企业实现盈利增长,去哪找自贡网站建设
SEO优化全攻略提升网站排名的关键步骤与未来趋势,这是什么新晋动画ai
如何识别文章是否由AI写作:技巧与方法解析
SEO关键词是什么意思?全面解析SEO关键字的核心作用,华为ai音箱 百度ai音箱
什么是SEO可以自学吗,seo零基础可以自学吗 ,ai1紫
Chat免费,让沟通无界限,尽享智能对话时代,ai没办法置顶
seo适合什么职业,seo有前途么 ,ai小精灵
SEO合作:让你的网站在搜索引擎中脱颖而出,惠州抖音seo策划公司
产品seo什么意思,产品seo标题是什么 ,ai模仿张宇
为什么选择B站VIP?让你畅享更丰富的视听体验,小门类网站seo
seo管理系统是什么,seo网站管理 ,过度圆ai
seo要学会什么,seo要学多长时间 ,NTU AI 录取
SEO模板:提升网站排名,助你快速抢占搜索引擎流量高地,选择seo职业缺点
GPT哪个模型是最新的?AI语言生成的未来,ai回头
seo网络上什么意思,seo表示什么 ,如何避免今日头条ai写作检测
AI+写文章:开启智能创作新时代