原型模式

每个构造函数都有一个原型属性(prototype)这个原型属性指向一个原型对象,我们可以给这个原型对象设置属性和方法,这些属性和方法可以给通过该构造函数创建的对象使用。         换句话说,也可以理解为通过该构造函数创建出来的对象,继承于这个原型对象,可以直接使用原型对象的属性和方法。

以下这种创建对象的有一个好处就是相比较上面而言,更节省空间,上面的方法在不同的对象里,下面的是无论创造出多少对象,共用一个方法,也就是说方法在同一块内存堆里

function Person(name){

this.name=name;

}

Person.prototype.sayHello=function(){

//这个this依然表示当前通过Person构造函数创建出来的对象

console.log("大家好,我叫:"+this.name);

}

与原型相关的知识点

1.支持运行时添加方法,在添加方法之前创建的对象,依然可以使用这个方法

也就是说,我先new出了实例对象来,我又在下面给构造函数添加了方法,这个上面new出来的实例依然可以使用这个方法

2.也可以给内置构造函数的原型添加方法

String.prototype.reverse = function () {

var resultStr = "";

for (var i = this.length - 1; i >=0; i--) {

resultStr += this[i];

}

return resultStr;}  str.reverse()  "小雪转大雪".reverse()

3.也支持重新覆盖掉,原来的方法,

注意:!!!!不到万不得已的时候,千万别去覆盖系统自带的方法。否则后果自负!!!!

Array.prototype.indexOf = function (ele) {

console.log("乱改!");

}

原型链及其原型方法和属性相关

何为原型链:

每个对象都有一个对应的原型对象,这个原型对象本身也是一个对象,那么既然它也是一个对象,所以它也应该会有一个属于它的原型对象,以此类推,一直到Object.prototype为止。Object.prototype的原型是null。通过以上分析,会形成一条链子,这条链子被称作为原型链。

例:

//通过不同的方式来生成原型链

var obj = {

"name" : "小雪"

}

obj对象继承了Object.prototype的属性和方法

所生成的原型链为:

obj --> Object.prototype --> null

数组

var arr = ["小雪", "小王"];

arr对象继承了Array.prototype的属性和方法

所生成的原型链为:

arr --> Array.prototype --> Object.prototype --> null

函数

function fn () {

console.log("小雪");

·· }

fn对象继承了Function.prototype的属性和方法

所生成的原型链为:

 fn --> Function.prototype --> Object.prototype --> null

自定义对象

function Person (name) {

this.name = name;

}

var person1 = new Person("小雪");

person1对象继承了Person.prototype的属性和方法

生成的原型链为:

person1 --> Person.prototype --> Object.prototype --> null

//Object.create():这个方法可以用来创建对象,创建出来的对象继承于这个方法的参数。换一句话说,也就是,这个方法的参数是一个对象,而且它是创建出来的那个对象的原型对象。

var a = {

"name" : "包女士"

}

//通过Obejct.create方法生成一个新的对象

var b = Object.create(a);

//生成的原型链:b --> a --> Object.prototype --> null

console.log(b.name);

var c = Object.create(b);

//生成的原型链:c --> b --> a --> Object.prototype --> null

console.log(c.name);

var d = Object.create(null);

//生成的原型链:d --> null

//constructor每个原型对象都有constructor属性,这个属性指向的是该原型对象所在的构造函数

console.log(Person.prototype.constructor);

console.log(person1.constructor);

//hasOwnProperty(): 判断一个对象是否有某个属性,返回值是一个布尔值

console.log(Person.prototype.hasOwnProperty("constructor"));

console.log(person1.hasOwnProperty("constructor"));  //false  ,证明这个constructor不是person1的,是继承来的

总结:当调用某个对象的属性或方法的时候,首先去查找该对象自身是否有这个属性和方法,如果没有的话,就沿着原型链去往上找,如果找到了就可以直接使用,如果没找到,就继续找,以此类推,直到找到null为止。

Object.getPrototypeOf(): 返回一个对象的原型对象

console.log(Object.getPrototypeOf(person1));

isPrototypeOf(): 判断一个对象是否是另外一个对象的原型对象

console.log(b.isPrototypeOf(c)); //bc的原型对象所以是true

欢迎大家一起交流 相互学习
原文地址:https://www.cnblogs.com/zss1/p/8933142.html