<script>
function CreateJsPerson(name,age) {
this.name = name;
this.age = age;
}
CreateJsPerson.prototype.writeJs = function () {
console.log("ny name is" + this.name + ",i can write js");
};
var p1 = new CreateJsPerson("lala",18);
var p2 = new CreateJsPerson("dd",19);
console.log(p1.writeJs===p2.writeJs);//->true
//构造函数模式中拥有了类和实例的概念,并且实例和实例之间是相互独立开的->实例识别
//基于构造函数模式的原型模式解决了方法或者属性公有的问题->把实例之间相同的属性和方法提取成公有的属性和方法
//想让谁公有就把他放在CreateJsPerson.prototype上即可
//1.每一个函数数据类型(普通函数,类)都有一个天生自带的属性:prototype(原型),并且这个属性是一个对象数据类型的值
//2.并且在prototype上浏览器天生给他加了一个属性constructor(构造函数),属性值是当前函数(类)本身
//3.每一个对象数据类型(普通的对象,实例,prototype...)也天生自带一个属性:__proto__,这个属性属性值是当前实例所属类的原型(prototype)
function Fn() {
this.x = 100;
this.sum = function(){};
}
Fn.prototype.getX = function () {
console.log(this.x);
};
Fn.prototype.sum = function () {
};
var f1 = new Fn;
var f2 = new Fn;
console.log(Fn.prototype.constructor === Fn);//->true
//Object是js中所有对象数据类型的基类(最顶层的类)
//1.f1 instanceof Object->true 因为f1通过__photo__可以向上级查找,不管有多少级,最后都能找到Object
//2.在Object.prototype上没有__photo__这个属性
//3.原型链模式
f1.hasOwnProperty("x");//->x是f1的一个属性
//但是我们发现在f1的私有属性上并没有这个方法,那我们是如何处理的
//通过 对象名.属性名 的方式获取属性值的时候,首先在对象私有的属性上进行查找,如果私有中存在这个属性,则
//获取的是私有的属性值,如果私有没有,则通过__photo__找到所属类的原型(累的原型上定义的属性和方法都是当前
//实例公有的属性和方法),原型上存在的话,获取的是公有的属性值;如果原型上也没有,则继续通过原型上的__photo__
//继续向上查找,一直找到Object.prototype为止....
//这种查找机制,就是我们的原型链模式
// f1.getX===f2.getX ->true
// f1.__photo__.getX===f2.getX ->true
// f1.getX===Fn.prototype.getX->true
// f1.sum===f2.__proto__.sum->false
// f1.sum===Fn.prototype.sum->false
// f1.hasOwnProperty->f1.__proto__.__proto__.hasOwnProperty
//在IE浏览器中,我们原型模式也是同样的原理,但是IE浏览器怕你通过__proto__把公有的修改,禁止我们使用__proto__;
f1.sum = function () {
//修改自己私有的sum
};
f1.__proto__.sum = function () {
//修改所属类原型上的sum
};
Fn.prototype.sum = function () {
//修改公有的sum
};
</script>
原型链模式基础
最新推荐文章于 2024-09-07 16:16:02 发布