原型
1、定义:原型是function对象的一个属性,它定义了构造函数制造出的对象的公共祖先。通过该构造函数产生的对象,可以继承该原型的属性和方法。原型也是对象。
Person.prototype //--原型
function Person(name,age,sex){
this.name = name;
this.age = age;
this.sex = sex;
}
var person = new Person("xunming",35,"male");
(prototype在构造函数出生的时候就已经被定义好了。)
构造函数满足一个特点:命名大驼峰式命名规则。
2、原型的应用:
(1)、利用原型的特点和概念,可以提取公有属性。有些情况下,几个对象有些属性相同,重复书写会造成代码的冗余。
改进前:
function Car(color,owner){
this.owner = owner;
this.carName = "bmw";
this.height = 1400;
this.lang = 4900;
this.color = color;
}
var car = new Car("red","bmw",1400,4900,"prof.ji");
var car1 = new Car("blue","bmw",1400,4900,"long");
我们可以发现car和car1的name height lang属性值是相同的,这个时候我们可以将这些属性赋值给函数原型。
改进后:
Person.prototype = {
height:1200;
lang:4900;
carName : "bmw";
}
function Car(color,owner){
this.owner = owner;
this.color = color;
}
var car = new Car("red","prof.ji");
var car = new Car("blue","long");
(2)、修改原型的属性:对象修改原型的属性时只能通过调用原型的属性进行改变。
Person.prototype.lastname = "deng";
function Person(name){
this.name = name;
}
var person = new Person("sumong");
Person.prototype.lastname = "liu"; //改变原型的属性
(3)、对象属性的增删:
(4)、如果使用new Person()创建多个对象person、person1,则多个对象都会同时指向Person构造函数的原型对象。
(5)、如果我们访问person中的一个属性name,如果在person对象中找到,则直接返回。如果person对象中没有找到,则直接去person对象的__proto__属性指向的原型对象中查找。
(6)原型的几个属性:
prototype属性:我们只要创建了一个函数,就会根据一组特定的规则为这个函数创建一个prototype属性。这个属性指向函数的原型对象。
constructor属性:创建了一个自定义构造函数后,其原型对象默认只会取得constructor属性。指向了构造函数。
_proto_属性:(这是一种隐式命名规则,是系统命名的): 这个属性指向了构造方法的原型对象。
function Person(){
}
var person = new Person();
_proto_属性可以修改:
function Person(){
}
var obj = {
name : "sunny"
}
var person = new Person();
person._proto_ = obj;
hasOwnProperty()方法:用来检测一个属性是否存在于实例中,还是存在于原型中。(它是从Object中继承来的)只在给定属性存在于对象实例中时,才会返回true。调用person.Property("name")时,只有当person重写name属性后才会返回true,因为只有这个时候name才是一个实例属性,而非原型属性。
function Person(){
}
Person.prototype = {
name:"hhh",
age : 29,
}
var person = new Person();
in操作符:用来判断一个属性是否存在于这个对象中。
function Person(){
}
Person.prototype = {
name:"hhh",
age : 29,
}
var person = new Person();
由于in操作符只要通过对象能够访问到属性就返回true,hasOwnProperty()只在属性存在于实例中才会返回true,因此只要in操作符返回true而hasOwnProperty返回false,就可以确定属性是原型的