构造函数也是函数,只是调用的方法不同。构造函数通过new来调用,也可以通过别的方法调用。
//当做构造函数使用
var person1 = new Person("hcd",20,"work");
person1.say();
//作为普通函数调用
Person("name","age");
window.say();
//在全局环境下调用函数时,this指向Global对象(浏览器中就是window对象),因此可以用window调用say()方法。
//在另外一个对象的作用域中调用,this指向o对象
var o = new Object();
Person.call(o,"namep","age");
o.say()
实例不能更改原型的属性和方法
functionPerson(){}
Person.prototype.name = "hcd";
Person.prototype.say = function(){
alert(this.name)
}
var person1 = new Person();
var person2 = new Person();
person1.prototype.name = "pppp";//会报错的,Cannot set property 'name' of undefined
alert(person1.name)
实例只能增删改自己的属性和方法
functionPerson(){}
Person.prototype.name = "hcd";
Person.prototype.say = function(){
alert(this.name)
}
var person1 = new Person();
var person2 = new Person();
person1.name = "ppp";
alert(person1.name)//"ppp",来自perosn1
alert(person2.name)//"hcd",来自原型对象delete person1.name;//删除person1的name属性
alert(person1.name)//"hcd",来自原型对象
alert(person1.hasOwnProperty("name"))//false
简写原型对象
functionPerson(){}
Person.prototype={
name:"hcd",
age:29,
say:function(){
alert(this.name)
}
}
var person1 = new Person();
person1.name = "ppp"; //"hcd"
可以随时改原型对象的属性但是要注意顺序
functionPerson(){}
Person.prototype={
name:"hcd",
age:29,
say:function(){
alert(this.name)
}
}
var person1 = new Person();
alert(person1.name);//"hcd"
Person.prototype={
like:"person"
}
var person2 = new Person();
alert(person2.name); //undefined
alert(person2.like); //"person"
alert(person1.name); //"hcd"
alert(person1.like); //"hcd"
因为Person.prototype已经没有了name,age,say属性和方法,为重新定义的like属性。但是person1的原型对象还是原来的,是有name属性的
问题:
所有的实例的属性在默认情况下是一样的,
functionPerson(){}
Person.prototype={
name:"hcd",
age:29,
friends:["a"],
say:function(){
alert(this.name)
}
}
var person1 = new Person();
var person2 = new Person();
person1.friends.push("p");
console.log(person2.friends)//["a","p"]
因为共享资源,所以导致向person1.friends里面push,person2.friends会受到影响
4.组合使用原型和构造函数
functionPerson(name,age){this.name = name;
this.age = age;
}
Person.prototype = {
say:function(){
alert(this.name);
}
}
var person1 = new Person("hcd",20);
person1.say();