/****************** 面向对象 ******************/

/********** 一:对象创建、原型链 **********/

/*讨论 构造函数(类方式)创建对象 ,深入理解这些内容,是很重要的*/

function MyFunc() { }; //定义一个空函数var anObj = new MyFunc(); //使用new操作符,借助MyFun函数,就创建了一个对象//等价于:function MyFunc() { };

var anObj = {}; //创建一个对象anObj.__proto__ = MyFunc.prototype;

MyFunc.call(anObj); //将anObj对象作为this指针调用MyFunc函数/*用 var anObject = new aFunction() 形式创建对象的过程实际上可以分为三步:

第一步:建立一个新对象(anObject);

第二步:将该对象内置的原型对象(__proto__)设置为构造函数prototype引用的那个原型对象;

第三步:将该对象作为this参数调用构造函数,完成成员设置等初始化工作。

对象建立之后,对象上的任何访问和操作都只与对象自身及其原型链上的那串对象有关,

与构造函数再扯不上关系了。

换句话说,构造函数只是在创建对象时起到介绍原型对象和初始化对象两个作用。

原型链:(参考:http://hi.baidu.com/fegro/blog/item/41ec7ca70cdb98e59152eed0.html)

每个对象(此处对象应该仅指大括号括起来的object,不包括function、array。待验证?)

都会在其内部初始化一个属性,就是__proto__,当我们访问一个对象的属性时,

如果这个对象内部不存在这个属性,那么他就会去__proto__里找这个属性,

这个__proto__又会有自己的__proto__,于是就这样 一直找下去,也就是我们平时所说的原型链的概念。*/

/*理解了对象创建的原理,可试着分析下边两个示例的结果*/

var yx01 = new function() {return "圆心"};

alert(yx01); //[object Object]var yx02 = new function() {return new String("圆心")};

alert(yx02); //“圆心”/*解释:

"圆心"是基本的字符串类型,new String("圆心")则创建了一个string对象。

只要new表达式之后的构造函数返回一个引用对象(数组,对象,函数等),都将覆盖new创建的对象,

如果返回一个原始类型(无 return 时其实为 return 原始类型 undefined),

那么就返回 new 创建的对象。

参考:http://www.planabc.net/2008/02/20/javascript_new_function/*/

/********** 二:数据类型的检测 **********/

/*判断数据类型可能想到的方法:

constructor、typeof、instanceof、Object.prototype.toString.call()*/

/***** 1、通过constructor属性 *****/

var myvar= new Array("a","b","c","d");

function A(){}

myvar.constructor = A;

var c = myvar.constructor;

alert(c); //function A(){}//可见,通过constructor属性获取类型的方法很容易被修改,不应该用来判断类型。

/***** 2、通过typeof *****/

/*typeof是一个操作符,而不是个函数。

typeof的实际应用是用来检测一个对象是否已经定义或者是否已经赋值。

如if(typeof a!="undefined"){},而不要去使用if(a)因为如果a不存在(未声明)则会出错。

typeof检测对象类型时一般只能返回如下几个结果:

number,boolean,string,function,object,undefined。

对于Array,Null,自定义对象 等使用typeof一律返回object,

这正是typeof的局限性。*/

var num = new Number(1);

var arr = [1,2,3];

alert(typeof num); //object 而不是numberalert(typeof arr); //object 而不是Arrayalert(typeof null); //object

/***** 3、通过 instanceof *****/

/*用instanceof操作符来判断对象是否是某个类的实例。

如果obj instanceof Class返回true,那么Class的原型与obj原型链上的某个原型是同一个对象,

即obj要么由Class创建,要么由Class的子类创建。*/

function t(){};

t.prototype = Array.prototype;

//t.prototype = [];var x = new t();

alert(x instanceof t);//弹出truealert(x instanceof Array);//弹出truealert(x instanceof Object);//弹出true/*由此可知,通过 instanceof 判断数据类型也不可靠。

因为一个对象(此处x)的原型链可以很长,每个原型的类型可以不同。

另外在iframe内也会容易出错:

即有个页面定义了一个数组a,页面又嵌套了一个IFrame,在Iframe里面通过 top.a instanceof Array, 是返回false的。

这个说明 父页面和内嵌iframe里的对象是不同的,不能混合在一起使用。

改成top.a instanceof top.Array 就会返回true*/

/***** 4、通过 Object.prototype.toString.call() *****/

/*Object.prototype.toString.call() 作用是:

1、获取对象的类名(对象类型)。

2、然后将[object、获取的类名]组合并返回。

可应用于判断Array,Date,Function等类型的对象*/

var num = new Number(1);

var arr = [1,2,3];

alert(Object.prototype.toString.call(num)); //[object Number]alert(Object.prototype.toString.call(arr)); //[object Array]

//扩展示例:(apply等价于call)window.utils = {

toString: Object.prototype.toString,

isObject: function (obj) {

return this.toString.apply(obj) === '[object Object]';

},

isFunction: function (obj) {

return this.toString.apply(obj) === '[object Function]';

},

isArray: function (obj) {

return this.toString.apply(obj) === '[object Array]';

}

}

function A() { }

window.utils.isFunction(A); //truewindow.utils.isObject(new A()); //truewindow.utils.isArray([]); //true

/*jQuery等框架 就是用这个方法判断对象的类型的,因此可以把这种方法作为权威的判断方法。

但是,如果重写了Object.prototype.toString方法,这时候再用来判断数据类型可能就会出错,

所以,一般不要去重写Object.prototype.toString方法。*/

/********** 三:继承 **********/

/*JS继承和闭包一样,几乎是每个想深入学习JS的朋友都要讨论的问题,因此各种相关资料应有尽有。

JS继承代码的版本非常多,但原理都是一样的,核心都是利用了prototype对象。

为了和其他面向对象语言的风格相似,大多数都采用“类式”风格模拟。

继承的详细原理不再赘述,网上有许多资料介绍。

这里给出一个示例:Jquery作者John Resig写的继承。

(其中的详细注释是来自某个博客,不知道是谁原创,这里私自转帖出来)*/

(function () {

//initializing变量用来标示当前是否处于类的创建阶段,//- 在类的创建阶段是不能调用原型方法init的//- 我们曾在本系列的第三篇文章中详细阐述了这个问题//fnTest是一个正则表达式,可能的取值为(/\b_super\b/ 或 /.*/)//- 对 /xyz/.test(function() { xyz; }) 的测试是为了检测浏览器是否支持test参数为函数的情况//- 不过我对IE7.0,Chrome2.0,FF3.5进行了测试,此测试都返回true。//- 所以我想这样对fnTest赋值大部分情况下也是对的:fnTest = /\b_super\b/;var initializing = false, fnTest = /xyz/.test(function () { xyz; }) ? /\b_super\b/ : /.*/;

//基类构造函数//这里的this是window,所以这整段代码就向外界开辟了一扇窗户 - window.Classthis.Class = function () { };

//继承方法定义Class.extend = function (prop) {

//这个地方很是迷惑人,还记得我在本系列的第二篇文章中提到的么 //- this具体指向什么不是定义时能决定的,而是要看此函数是怎么被调用的 //- 我们已经知道extend肯定是作为方法调用的,而不是作为构造函数 //- 所以这里this指向的不是Object,而是Function(即是Class),那么this.prototype就是父类的原型对象 //- 注意:_super指向父类的原型对象,我们会在后面的代码中多次碰见这个变量 var _super = this.prototype;

//通过将子类的原型指向父类的一个实例对象来完成继承 //- 注意:this是基类构造函数(即是Class) initializing = true;

var prototype = new this();

initializing = false;

//我觉得这段代码是经过作者优化过的,所以读起来非常生硬,我会在后面详解 for (var name in prop) {

prototype[name] = typeof prop[name] == "function" &&

typeof _super[name] == "function" && fnTest.test(prop[name]) ?

(function (name, fn) {

return function () {

var tmp = this._super; //这里是必要的,第91行注释代码可说明之。 this._super = _super[name];

var ret = fn.apply(this, arguments);

this._super = tmp;

return ret;

};

})(name, prop[name]) :

prop[name];

}

//这个地方可以看出,Resig很会伪装哦 //- 使用一个同名的局部变量来覆盖全局变量,很是迷惑人 //- 如果你觉得拗口的话,完全可以使用另外一个名字,比如function F()来代替function Class() //- 注意:这里的Class不是在最外层定义的那个基类构造函数 //这里的Class和上边的window.Class函数不一样,这里是window.Class内部的函数局部变量 function Class() {

//在类的实例化时,调用原型方法init if (!initializing && this.init)

this.init.apply(this, arguments);

}

//子类的prototype指向父类的实例(完成继承的关键) Class.prototype = prototype; //Class指代上边的Class,并非一开始的window.Class //修正constructor指向错误 //是否可用Class.prototype.constructor = Class;来修正??? Class.constructor = Class;

//子类自动获取extend方法,arguments.callee指向当前正在执行的函数 Class.extend = arguments.callee;

return Class;

};

})();

学java需要哪些js知识点_JS重要知识点相关推荐

  1. java 静态方法_新手学Java,哪些知识点可以优先掌握?

    --我们的征途是星辰是大海-- 文|达妹 很多同学在刚接触Java的时候,会有些迷茫,不知道该从哪里入手,该学习掌握哪些必要的基础知识. 达妹总结了零基础学习Java编程语言的几个基础知识要点.希望对 ...

  2. 跟我学 Java 8 新特性之 Stream 流(二)关键知识点

    转载自   跟我学 Java 8 新特性之 Stream 流(二)关键知识点 我们的第一篇文章,主要是通过一个Demo,让大家体验了一下使用流API的那种酣畅淋漓的感觉.如果你没有实践,我还是再次呼吁 ...

  3. 南通大学java期末_南通大学生学Java,掌握这20%知识点至关重要!

    南通大学生学Java,掌握这20%知识点至关重要! 嗨,南通的同学们,又见面了!今天我们来谈谈关于Java学习的那点事儿.不管手机前的你,是选择自学Java还是参加Java培训班,建议都来看看这篇文章 ...

  4. java 分布式计算框架_学Java分布式和高级架构,必懂的两大知识点!

    原标题:学Java分布式和高级架构,必懂的两大知识点! 第一部分:分布式 三步变成:分布式 1.将你的整个软件视为一个系统(不管它有多复杂) 2.将整个系统分割为一系列的 Process(进程), 每 ...

  5. 大专的我是如何学Java的,这里列出了必学知识点,以及内部资料免费领取

    基础很重要,基础不牢,山崩地裂,建议大家还是稳扎稳打,这样才可以走的更长更远. 还有就是一定要有一个自己的规划和方向,然后朝着目标一步一步地学习奋斗,只要坚持,总会有回报的. 希望大家能看完,看完这篇 ...

  6. 跟老杨学java系列(一)前传

    跟老杨学java系列(一)前传 首先声明一下哈,本人文笔水平有限,不喜勿喷.欢迎大家留言探讨技术问题.其他问题概不回复. 上台来首先做个自我介绍(~~偷师相声开场白),本人从事IT开发行业快二十个年头 ...

  7. 最详细的Java入门完整教程,学Java先收藏了

    从 1995 年第一个版本发布到现在,Java 语言已经在跌宕起伏中走过了 26 年,最新的 Java 版本也已经迭代到 Java 16. java是有一个庞大的生态系统,它的覆盖范围非常广,而且已经 ...

  8. 自己的一点经历,为什么最后要去学java

    可能有点乱,写给自己,写到哪里算那里吧 一点经历 大专三年浑浑噩噩,电子信息专业,完全不知道学了什么,貌似有接电路线,焊电路板,还有一点通信,然后在女朋友(前女友了,我这么堕落可能不配有女朋友了吧)的 ...

  9. 学Java技术,这些问题要避免

    参加java培训学习java技术不是一朝一夕就能学会的事情,在学习的过程中还要注意学习方式,有一些错误是要避免的,下面我们就为大家详细的介绍一下学java技术要避免哪些问题? Java培训分享:学Ja ...

最新文章

  1. OpenCV2.4.4中调用SIFT特征检测器进行图像匹配
  2. 使用PIE/PIF值判断DVD刻录机的刻录品质
  3. 在同一基准下对前端框架进行比较(2019年更新)
  4. Go语言 中文分词技术使用技巧(一)
  5. 互联网级监控系统必备-时序数据库之Influxdb技术
  6. 岛国小姐姐来例假时,男朋友背着她偷偷查手机......
  7. 离线计算中的幂等和DataWorks中的相关事项
  8. springboot整合MyCat
  9. 自动档汽车正确的操作方法和习惯---请教贴
  10. 'nmake' 不是内部或外部命令,也不是可运行的程序 或批处理文件。
  11. jetson nano使用python读取解析GPS数据(GPRMC,GPGGA)。
  12. 最新章节 第138章 量子生物计算机,生生不息的世界
  13. 报错 [Error] expected primary-expression before ‘)‘ token
  14. 树莓派 python 驱动 lcd tft spi 2.8寸 ili9341 240x320
  15. 2019, XII Samara Regional Intercollegiate Programming (G、H、J、K、L题解)
  16. pandas使用to_feather函数将dataframe保存为feather文件(需要依赖pyarrow包)提升大文件读取效率、pandas使用read_feather函数读取feather文件
  17. 我们来试着解答一下下面的题目(8)(DP/多重部分和)
  18. VC修改IE滚动条宽度
  19. foxit 福昕阅读器 点击书签跳转时,保持 页面 缩放比例
  20. 吐血整理一个月——终于把所有Python库整理齐了.....

热门文章

  1. 模式代码 java中aes_深入浅出:Java中的代理模式
  2. OpenShift 4 - 用自定义的TLS证书对访问OpenShift的用户认证身份
  3. 容器入门(4) - skopeo
  4. Visual Studio 2019 RC入门——第1部分
  5. 在React中加载数据:redux-thunk,redux-saga,suspense,hooks
  6. 使用Visual Studio 2017创建React项目
  7. profibus dp协议_PROFIBUS-DP总线的应用及布线安装要点
  8. c语言 get post,简述GET和POST的区别
  9. python爬虫要不要学正则_Python爬虫入门,如何使用正则表达式
  10. html一个div调用的一个php页面,打开一个HTML文件,一个div/iframe中内PHP