js constructor的实际作用分析_javascript技巧

复制代码 代码如下:

<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>

时间: 2024-09-11 15:58:08

js constructor的实际作用分析_javascript技巧的相关文章

JS动态添加选项案例分析_javascript技巧

本文实例分析了JS动态添加选项的方法.分享给大家供大家参考,具体如下: 一.问题: 要做一个调查问卷,问题数量不定,问答答案不定. JS控答案效果图 二.实现方法: 为了实现这个效果,点击那个按钮就在下面添加4个答案框,选择从A-Z这26个字母,就是为了ASSIC码方便处理 看看HTML结果 <table width="100%" class="form"> <tr> <th width="100px"><

JS搜狐面试题分析_javascript技巧

本文实例讲述了几道JS搜狐面试题.分享给大家供大家参考,具体如下: 一.实现一个遍历数组或对象里所有成员的迭代器. var each = function(obj, fn){ //+++++++++++答题区域+++++++++++ //+++++++++++答题结束+++++++++++ }; try{ var data1 = [4,5,6,7,8,9,10,11,12]; var data2 = { "a": 4, "b": 5, "c":

JS弹性运动实现方法分析_javascript技巧

本文实例分析了JS弹性运动实现方法.分享给大家供大家参考,具体如下: 描述:像弹簧一样左右弹动,最后缓慢停下来 一.加减速运动 1.加速运动 var iSpeed=0; iSpeed++; 速度越来越快,最后冲出去 2.减速运动 var iSpeed=20; iSpeed--; 速度越来越慢,降到0后开始变负值往反方向运动 二.弹性运动 1.在目标点左边,加速:目标点右边,减速,如 if(div1.offsetLeft<300){ iSpeed=iSpeed+1; //等同iSpeed++; }

JS实现Ajax的方法分析_javascript技巧

本文实例分析了JS实现Ajax的方法.分享给大家供大家参考,具体如下: 一.什么是Ajax 不刷新的情况下读取数据或提交数据 (最早出现ajax:谷歌地图,拖动一下出现一片新的视野) 应用:用户注册.在线聊天.微博 特性:只能从服务器上去读取数据(所以我们需要配置自己的服务器程序AMP) 二.使用Ajax 1.基础:请求并显示静态TXT文件 btn.onclick=function(){ ajax('abc.txt',function(str){ alert(str); }); } ①Ajax里

JS运动基础框架实例分析_javascript技巧

本文实例讲述了JS运动基础框架.分享给大家供大家参考.具体分析如下: 这里需要注意: 1. 在开始运动时关闭已有的定时器 2. 把运动和停止隔开 复制代码 代码如下: <!DOCTYPE html>  <html>      <head>          <meta charset="utf-8">          <title></title>          <style type="te

js字符编码函数区别分析_javascript技巧

1.escape对ansi码0-255以外的字符进行编码输出%u****格式即unicode值,escape 方法返回一个包含了 charstring 内容的字符串值( Unicode 格式).所有空格.标点.重音符号以及其他非 ASCII 字符都用 %xx 编码代替,其中 xx 等于表示该字符的十六进制数.例如,空格返回的是 "%20"  escape不编码字符有69个:*,+,-,.,/,@,_,0-9,a-z,A-Z  2.encodeURI类似escape,用于地址栏编码  e

JS实现太极旋转思路分析_javascript技巧

刚学了js的一些函数,所以做了一个太极的旋转.做完之后是上面这个样子的,是可以旋转的. 思路: 1.先做一个基准转盘,之后将元素都放在转盘上,跟随转盘动. 2.画两个半圆,主要属性是border-top-right-radius: 250px; 像素值为长边的一半. 3.然后画4个圆,以基准转盘为父元素,按照下面黑色圆一样的思路再画另外一边白色的圆,最后再在两个中等的圆上画两个小圆. 4.设置定时器: //旋转角度 var deg = 0 //设置定时器,100毫秒动一次 var tid = s

JS鼠标拖拽实例分析_javascript技巧

本文实例讲述了JS鼠标拖拽实现方法.分享给大家供大家参考,具体如下: JS代码: <script> window.onload=function() { var oDiv=document.getElementById('div'); var disX=0; var disY=0; oDiv.onmousedown=function(ev) //鼠标按下DIV { var oEvent=ev||event; disX=oEvent.clientX-oDiv.offsetLeft; //鼠标的X

JS面向对象编程之对象使用分析_javascript技巧

因为大家总是用面向过程的编程思想来写JS代码,而且也由于网络上充斥了太多小"巧"的JS代码段,很多都是随意而为,很不规范,这也就造成了大家对JS的"误解",一味的认为它就是一个辅助的小东东,而不适合做大的东西开发.但是自从AJAX兴起后,大量的JS代码编写要求人们具备像写JAVA类似的代码一样,能够面向对象进行开发. 所以下面就结合我自己的体会和所学习的东东和大家一起来学习在JS中如何使用面向对象的编程.其实使用JS进行面向对象开发也不是很难的事情,因为在JS中每一