渡一——11-2原型,原型链,call/apply(下)
认识proto
Person.ptototype.name = 'abc'; function Person(){ /*var _private //私人属性 __proto__系统属性*/ var this = { __proto__ : Person.prototype } } var person = new Person(); person.__proto__//系统属性
Person.prototype.name = 'sunny'; function Person(){ var this = {__proto__ : Person.prototype} } var person = new Person(); Person.prototype = {//从新开了一个空间 name : "cherry" } person.name //sunny Person.name //cherry var obj = {name:'a'}; var obj1 = obj; obj = {name:'b'}//新开空间 obj.name //b obj1.name //a Person.prototype = {name:'a'}; __proto__ = Person.prototype; Person.prototype = {name:'b'};
Person.prototype.name = 'sunny'; function Person(){ // var this = {__proto__ : Person.prototype} } //这次是直接就改了,如果在下面就是指向后再修改 Person.prototype = {//从新开了一个空间 name : "cherry" } var person = new Person(); person.name //cherry
原型链
1.如何构成原型链
2.原型链上属性的增删改查
3.绝大多数对象的最终都会继承自Object.prototype;
4.Object.create(原型)
// Grand.ptototype.__proto__ = Object.prototype //最终 Grand.ptototype.lastName = "Deng"; function Grand(){ } var grand = new Grand(); Father.prototype = grand; function Father(){ this.name = "xuming"; this.fortune = { card1 : 'visa' } this.num = 1; } var father = new Father(); Son.prototype = father; function Son(){ this.hobbit = "smoke" } var son = new Son(); son.hobbit //smoke son.name //xumin son.lastName //Deng son.fortune.card2 = 'master' //修改父亲 son.num++; father.num //100; son.num //101 取出来变成自己的属性
Person.ptototype = { name : 'a', sayName : function(){ console.log(this.name); }, height:100 } function Person(){ this.name = "b"; this.eat = function (){ this.height ++; } } var person = new Person(); person.sayName();//b Person.ptototype.sayName() //a person.eat();//height:101 取出来变成自己的属性
create指定原型创建对象
var obj = {}; var obj1 = new Object(); // obj1.__proto__ ----> Object.prototype; Object.create // var obj = object.create(原型) var obj = {name:"sunny",age:123} var obj1 = Object.create(obj); obj1.name //sunny Person.prototype.name = 'sunny'; function Person(){ // var this = {__proto__ : Person.prototype} } var person = new Person(); var person = Object.create(Person.prototype);//用Person上的原型来创建person person.name //sunny Object.create(null); var obj = Object.create(null);//与Object.prototype原型断开 // obj.__proto__ = Object.prototype
toStirng方法
//每个包装类都改写了自己的toString()方法 Object.prototype.toStirng Number.prototype.toStirng Array.prototype.toStirng Boolean.prototype.toStirng String.prototype.toStirng Number.prototype.toString = function(){ return "老邓身体好"; } var num = 123; num.toString() //"老邓身体好" // var obj ={}; var obj = Object.create(null)//断开了Object.__prototype__.toString()方法 document.write(obj)//报错 document.write调用了Object原型上的Object.toString()方法 var obj = Object.create(null) obj.toString = function(){ return "老邓身体好"; } document.write(obj); //"老邓身体好"
call&apply改变this指向,传参不同
function Person(name,age){ //this == obj this.name = name; this.age = age } var person = new Person('deng',100); var obj = {} Person.call(obj,'cheng',300); obj //{name:'name',age:300} function test(){} test ----> test.call() function Person(name,age,sex){ this.name = name; this.age = age; this.sex = sex; } function Student(name,age,sex,tel,grade){ Person.call(this,name,age,sex ); this.tel = tell; this.grade = grade; } var student = new Student('sunny',123,'male',139,2017)
function Wheel(wheelSize,style){ this.style = style; this.wheelSize = wheelSize; } function Sit(c,sitColor){ this.c = c; this.sitColor = sitColor } function Model(height,width,len){ this.height = height; this.width = width; this.len = len; } function Car(wheelSize,style,c,sitColor,height,width,len){ Wheel.call(this,wheelSize,style); //借腹生子 Sit.call(this,c,sitColor); Model.call(this,height,width,len); } var car = new Car(100,'好看','真皮',"red",1800,1900,4900);
Object.prototype.toString.call()方法
Object.prototype.toString.call(arr) == '[object Array]' //利用tostring方法判断类型--类似instanceof typeof功能 下面这种情况只能用Object.prototype.toString.call()方法 window.onload = function(){ var oF = documnet.createElement('iframe'); document.body.appendChild( oF ); var ifArray = window.frame[0].Array; var arr = new ifArray(); arr.constructor == Array arr instanceof Array Object.prototype.toString.call(arr) == '[object Array]' }
apply
call 需要把实参按照形参的个数传进云
apply 需要传一个arguments
// Wheel.apply(this,[wheelSize,style]); // Wheel.apply(this,arguments); function foo(){ bar.apply(null,arguments) } function bar(x){ console.log(arguments) } foo(1,2,3,4,5)