原型
function Person(){
//var this={__proto__:Person.prototype}
}
Person.prototype.name="sunny";
var person=new Person();
Person.prototype={
name:"cherry"
}
console.log(person.name);
这段代码因为先创建了对象,所以后期直接改变原型对其没有影响。输出sunny
。若将new放在后面,则输出cherry
.
Test.prototype.name="laowang";
function Test(){
this.name="renjialei";
}
var test=new Test();
var person=Object.create(Test.prototype);
console.log(person.name);
这段函数用了一个方法叫做 Object.create(Test.prototype),该方法里面需要添加对象的原型。
Object.prototype.toString=function(){
return "haha";
}
Person.prototype={
}
function Person(){
}
var person=new Person();
console.log(person.toString());
方法的重写,用tostring方法返回值是根据终端原型来划分的。可以在中间进行重写。
原型链
原型链是作为实现继承的主要方法,基本思想是利用原型让一个引用类型去继承另一个引用类型的属性和方法。如果将一个对象的原型指向了一个实例,实例中的所有属性和方法都将会继承在原型对象中。
function Person(){} //构造函数创建的过程第一步 var this={this.__proto__=Person.prototype}
function Person1(){}
Person1.prototype.name="zhangsan";
var person=new Person();
var person1=new Person1();
person.__proto__=person1; //person.__proto__===Person.prototype
console.log(person.name);
观察这段函数,可以将person1理解为this,所以通过__proto__属性将person1的原型赋给了person,如果person里面没有name属性,将会去person1里面寻找,然后进入person1的原型里面寻找。所以最后结果是zhangsan
.
function Person(){
}
function Person1(){
}
Person1.prototype.name="zhangsan";
Person.prototype=new Person1();
var person=new Person();
console.log(person.name);
这段代码和上面的用法一样的,但印证了实例中的属性和方法将会成为新指向他的原型的方法和属性,而实例的原型将会成指向他的原型的原型。
原型中有一种神奇的方法,它只会在实例中寻找属性,而不会去原型中搜索。这个方法叫做hasOwnProperty(),他的返回值是true和false.
var person = {
name: "renjialei",
age: 18
}
person.__proto__.sex = "man";
console.log(person.hasOwnProperty("name")); //true
call和apply
作用:改变this的指向
区别:后面传递参数的形式不同。
function Sub(name){
this.name=name;
}
function Sup(){
this.age=18;
Sub.call(this,"renjialei");
}
var sup=new Sup();
console.log(sup.name);
这段函数里面使用了call()方法,其中第一个是需传递的对象,后面是传递的参数。普通方法的调用比如sub(),其实系统在后台会这样调用sub call(),里面没有对象,所以是默认值。至于apply,在传递参数时,需要以数组的形式传递,并且只能有一个数组。