JavaScript对象创建及继承原理实例解剖

对象创建
当一个函数对象被创建时候,Function构造器产生的函数对象会运行类似这样的代码:

复制代码 代码如下:

this.prototype={constructor:this};

假设函数F
F用new方式构造对象时,对象的constructor被设置成这个F.prototype.constructor
如果函数在创建对象前修改了函数的prototype,会影响创建出来对象的construtor属性
如:
复制代码 代码如下:

function F(){};
F.prototype={constructor:'1111'};
var o=new F();//o.constructor===‘1111' true

继承原理
JavaScript中的继承是使用原型链的机制,每个函数的实例都共享构造函数prototype属性中定义的数据,要使一个类继承另一个,需要把父函数实例赋值到子函数的prototype属性。并且在每次new实例对象时,对象的私有属性__proto__会被自动连接到构造函数的prototype。
instanceof就是查找实例对象的私有prototype属性链来确定是否是指定对象的实例
具体实例
复制代码 代码如下:

//instanceof实现
function Myinstanceof(obj,type)
{
var proto=obj.__proto__;
while(proto)
{
if(proto ===type.prototype)break;
proto=proto.__proto__;
}
return proto!=null;
}
function View(){}
function TreeView(){}
TreeView.prototype=new View();//TreeView.prototype.__proto__=TreeView.prototype 自动完成
TreeView.prototype.constructor=TreeView;//修正constructor
var view=new TreeView();//view.__proto__=TreeView.prototype 自动完成
alert(view instanceof View); //true 查找到view.__proto__.__proto__时找到
alert(view instanceof TreeView); //true 查找到view.__proto__时找到
alert(Myinstanceof(view,View)); //true
alert(Myinstanceof(view,TreeView)); //true

上面自定义的Myinstanceof就是自己实现的一个instanceof功能的函数,由于IE内核实例存储prototype不是__proto__,所以Myinstanceof会无法通过,其他浏览器上应该都没有问题

本页内容版权归属为原作者,如有侵犯您的权益,请通知我们删除。
本文实例讲述了js实现透明度渐变效果的方法。分享给大家供大家参考。具体分析如下: 这里可实现一开始元素的透明度是30,鼠标移上的时候,透明度慢慢增加,到透明度100停止。鼠标移出,透明度慢慢减少,减少到30的效果。 要点一:因为无法直接获取和改变透明度的值,可以把透明度值赋给一个变量,让变量变化,最后把变量的值再赋给元素的透明值。 var alpha=30; 要点二:判断目标值和目前透明值,来判定是正向速度还是负向速度。 if(target alpha){speed = 2;}else{speed = -
1、一个正则表达式,只含有汉字、数字、字母、下划线不能以下划线开头和结尾:^(?!_)(?!.*?_$)[a-zA-Z0-9_\u4e00-\u9fa5]+$ 其中:^ 与字符串开始的地方匹配(?!_) 不能以_开头(?!.*?_$) 不能以_结尾[a-zA-Z0-9_\u4e00-\u9fa5]+ 至少一个汉字、数字、字母、下划线$ 与字符串结束的地方匹配 放在程序里前面加@,否则需要\\进行转义 @"^(?!_)(?!.*?_$)[a-zA-Z0-9_\u4e00-\u9fa5]+$" (或者:@"^
复制代码 代码如下: Script Language="javascript" function modify() { document.form1.action="modify.jsp"; document.form1.submit(); } function delete() { document.form1.action="delete.jsp"; document.form1.submit(); } /Script form name="form1" action="" INPUT Type="B
复制代码 代码如下: //设置选中的行样式。 function SetSelectTrClass(seltr, selclass, unselclass) { var thetable = seltr.parentElement; //i从1开始是因为列名的样式不变 for (var i = 1; i thetable.rows.length; i++) { var tr = thetable.rows[i]; tr.className = unselclass; } seltr.className =
Google一下“VBS监视注册表”,TOP 5都是一模一样的代码,我查了一下,出处是Hey, Scripting Guy! Blog上一篇名为《How Can I Monitor Changes to a Registry Key?》的文章,真是厚颜无耻。 文章我没时间翻译了,贴一下代码: 复制代码 代码如下: strComputer = "." Set objWMIService = GetObject("winmgmts:\\" strComputer "\root\default") Set col
锚点相信大家都使用过吧!点击后僵硬的切换是不是很不爽呢? 下面分享一个小技巧,根据锚点offset值来实现动画切换 !DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"html xmlns="http://www.w3.org/1999/xhtml"headmeta http-equiv="Content-Type" co
1.第一种写法:Input框中显示: 复制代码 代码如下: input id="cc" class="easyui-combobox" name="name" data-options="valueField:'value',textField:'text',data:[{'value':'1','text':'java'},{'value':'2','text':'C#'}]"/ 2. 第二种用法,在list列表中显示: 复制代码 代码如下: th data-options="field:'lb',ed

Javascript的&&和||的另类用法 - 2015-05-14 06:05:49

最近也没什么心思写文章了,感觉总有忙不完的事情,呵。 不过这些天又开始研究起 Titanium 来,发现其官方出品的MVC框架(Alloy)还是挺不错的,刚开始苦于没有好的代码来学习,文档又少,所以一直没去详细研究,后来发现原来官方的 CodeStrong 就是一套非常不错的学习代码,只要看通了其整套代码,相信对Alloy的使用也基本会了~ 在看其源码的同时,发现很多地方使用了诸如以下的用法: $.clouds ($.index.add($.clouds)); 开始不是很理解,毕竟平时这样用的也少,上了下
比如对javascript数组的排序 还有对数组数据的删选以及分组 所以,后来兴致以上来。 一发不可收拾。 写了一个能在javascript中应用的 SQL 库 后来又想,怎么不能用javascript直接连接数据库呢? 又做了一个javascript直连Sql数据的类库 后来,又想到其实还可以用SQL语句来操作HTML DOM模型 再再再后来,又看到了HTML5中对web DB的实现 所以对webDB,就是chrome和safari中的sqlite的封装 于是乎就有了: 1.从服务器上获取数据、执行SQL
注意如果是通过jq添加的层和对象一定要用live(),用其他的都不起作用 live的缺点就是,运行完以后不释放空间,太多的使用会占用更多的内存,bind()则点击完以后释放空间 区别一: Click here 可以给这个元素绑定一个简单的click事件: $('.clickme').bind('click', function() { $('body').append(' Another target '); }); 当点击了元素,就会弹出一个警告框。然后,想象一下这之后有另一个元素添加进来了。 尽管这个