回顾:1、function Student (name , age ){this.name = name;this.age = age;}Student.prototype = {//第一句执行sayHello : function(){console.log("nihao");}};var p = new Student('zhansa',19);代码分析:1、首先预解析的过程,声明构造函数Student,同时构造原型对象student.Prototype 2、第一句话执行第行代码。重新覆盖原型对象。原来的默认对象不再被指向 3、创建对象,new对象,然后构造函数的this指向当前对象 4、在构造函数内部,利用对象的动态特性给刚刚创建出来的对象提供属性name,age a)构造函数在调用的时候传入参数,‘zhansa’,19 b)因此对象属性为。。。 c)对象初始化完成以后,返回对象的地址给变量p 5、执行调用方法。p调用sayHello方法a)首先在p所指向的对象中查看没有sayHello方法b)然后在其原型对象,Student.prototype中查找c)在新的原型对象中有sayHello,因此调用它d)在该方法中打印
Object.create的方法
是es5中引入的新方法。
语法:
Object.Create(对象)返回一个新对象,返回的新对象的原型就是参数中表示的对象
功能:实现继承,创建一个原型继承自参数的对象
例如:
var o = {sayHello : function(){}};var o1 = Object.create(o);//创建一个对象o1,该新对象的原型即__proto__就是oo1.sayHello();//js对象是键值对集合【键 :值】var arr = Object.create([]);//1、存储数据arr.push(1);arr.push(2);arr.push(2,3,4,5,6,7);//2、遍历for ( var i = 0;i < arr.length;i++) {console.log('['+i+'] = ' + arr[i]);}
练习:如果浏览器不支持object.create怎么办
var o = {sayHello : function(){}};var o1 = Object.create(o);//创建一个对象o1,该新对象的原型即__proto__就是oo1.sayHello();//js对象是键值对集合【键 :值】var arr = Object.create([]);//1、存储数据arr.push(1);arr.push(2);arr.push(2,3,4,5,6,7);//2、遍历for ( var i = 0;i < arr.length;i++) {console.log('['+i+'] = ' + arr[i]);} //不要修改内置对象,如下:// if (!Object.create){ // Object.create = function(){}// }//该函数要实现原型继承,返回的对象应该继承自objfunction inherit ( Obj ){if(Object.create){return Object.create(Obj);}else {function F(){}F.prototype = Obj;return new F();}}
var arr = inherit([]);
对象的原型链
1、凡是对象都有原型
2、原型也有对象
问题
1、原型链到底到什么时候是个头 2、一个默认的原型链结构是怎样的 3、原型链结构对已知语法的修正
原型链的结构
凡是使用构造函数,并且没有利用赋值的方式修改原型,创建出来的对象就保留默认的原型链。
默认原型链结构是什么样子呢?
默认的原型链结构就是当前对象 ->构造函数.Prototype->object.Prototype->null
什么是原型式继承
所谓的原型式继承就是利用修改原型链的结构(增加、删除、修改)来世的实例对象可以使用整条链中的所有成员
这里的规则。
在js中,所有的对象字面量在解析之后,就是一个具体的对象,可以理解为调用对应的构造方法
1、例如在代码写上‘{}’,就相当于‘new object()’2、例如在代码写上‘[]’,就相当于‘new array()’3、例如在代码写上‘/。/’,就相当于‘new Regexp()’
注意:在底层理论执行的过程中,是否有调用构造函数,不一定,跟浏览器版本有关.
在js中使用Function 可以实例化函数对象。也就是说函数是个对象
1、函数是对象,就可以使用对象的动态特性2、函数是函数,可以创建其他对象3、函数是唯一可以限定变量作用域的结果
要解决的问题
1、Function如何使用
2、Function与函数的关系
3、函数的原型链结构
函数是Function的实例
语法:new Function(arg0,arg1,arg2.。。)
1、Function中的参数全部是字符串
2、该构造函数的作用是将参数连接起来组成函数
a) 如果参数只有一个,那么表示函数体
b) 如果参数有多个,那么最后一个参数表示函数体,其他表示参数
c) 如果没有参数,表示创建一个空函数
Arguments
Arguments 是一个为数组对象,表示在函数调用的过程中传入所有的参数集合.
在函数调用过程中没有规定参数的个数与类型,因此函数调用就具有灵活性.
为了方便使用,在每一个函数调用的过程中,函数代码体内又一个默认的对象arguments,它存储着实际传入的所有参数.
js中函数并没有规定必须如何传参
1、定义函数的时候不写参数,一样可以调用时传递参数2、定义的时候写了参数,调用的时候可以不传参3、定义的时候写了一个参数,调用的时候可以传入任意多个参数
在代码设计中,需要函数带任意个参数的时候,一般就不带任何参数,所有的参数利用arguments来获取
Function foo (/*。。。*/){}
function foo (){//所有的参数都在arguments中,将其当作数组使用//问题var args = arguments;var max = args[0];for (var i =1; i< args.length; i++){if(max < args[i]){max = args[i];}}return max;}console.log(foo(1,2,3,4,34,2,34234));
为什么要使用Function?
函数的原型链结构:
任意的一个函数,都相当于Function的实例。类似于{}与new object()的关系
Function foo(){}
相当于告诉解释器,又一个对象foo,它是一个函数
相当于new Function(),因此:
1、函数应该有什么属性?‘__proto__’;2、函数的构造函数Function()3、函数继承自Function.Prototype4、Function.prototype继承自object.Prototype
小结:
Object构造函数是Function的一个实例Object作为对象继承自Function.prototype.又F.prototype继承自Object.prototypeFunction是自己的构造函数(*****)
绘制Function的构造原型实例三角形结构
1、在js中任何对象的老祖宗就是Object.prototype
2、在js中任何函数的老祖宗就是Function.Prototype
小结:
每个函数都有prototype属性指向原型自定义的没有;每个对象都有—proto-属性指向原型;__proto__属性是为了能够直接使用原型的方法。
小结:
Object.create最简单原型继承对象原型链