JavaScript中构造函数及原型介绍

来源:互联网 发布:杭州萨满网络 编辑:程序博客网 时间:2024/05/17 09:45

一、构造函数及原型相关介绍

1、构造函数
(1)构造函数始终都应该以一个大写字母开头;构造函数本身也是函数,只不过可以用来创建对象;要创建构造函数的新实例,必须使用new操作符;
(2)构造函数例子:

function Person(name,age,job){    this.name=name;    this.age=age;    this.job=job;    this.sayName=function(){        alert(this.name);    };}var person1=new Person("Nicholas",29,"Software Engineer");var person2=new Person("Greg",27,"Doctor");

(3)构造函数调用所经历的步骤:
1)创建一个新的对象;
2)将构造函数的作用域赋给新对象(因此this指向了这个新对象);
3)执行构造函数中的代码(为这个新对象添加属性);
4)返回新对象
(4)构造函数存在的问题:每个方法都要在每个实例上重新创建一遍。(每定义一个函数就是实例化了一个对象),不同实例上的同名函数是不相等的。其解决方法便是使用原型模型。
2、原型
(1)每个函数都有一个prototype属性,这个属性是一个指针,指向一个对象。使用原型对象的好处是可以让所有对象实例共享它所包含的属性和方法。创建自定义的构造函数之后,其原型对象默认只会取得constructor属性,这个属性指向prototype属性所在函数,即Person.prototype.constructor指向Person
(2)当为对象实例添加一个属性时(person1.name=”Grey”),这个属性就会屏蔽原型对象中保存的同名属性。每当代码读取某个对象的某个属性时,首先从对象实例本身开始,其次搜索指针指向的原型对象,若在对象实例中已找到则返回,停止搜索。使用hasOwnProperty(“属性名”)方法确定访问的是实例属性还是原型属性,若返回为true则是实例属性。
(3)原型的动态性:对原型对象所做的任何修改能够立即从实例上反映出来——即使是先创建了实例后修改原型也照样如此:为原型添加属性和方法

var friend=new Person();Person.prototype.sayHi=function(){    alert("Hi");};friend.sayHi(); //"Hi"(没有问题)

重写整个原型对象

function Person(){}var friend=new Person();Person.prototype={    constructor: Person,    name: "Nicholas",    job: "Software Engineer",    age: 29,    sayName: funtion(){        alert(this.name);    }};friend.sayName(): //error

重写整个原型对象,就相当于吧原型修改为另一个对象,从而切断了构造函数与最初原型之间的联系,而实例中的指针仅指向原型,不指向构造函数,它们引用的仍然是最初的原型

`