JavaScript高级--原型

1.什么是原型

   原型是 js 中非常特殊一个对象,当一个函数创建之后,会随之就产生一个原型对象,当通过这个函数的构造函数创建了一个具体的对象之后,在这个具体的对象中就会有一个属性指向原型。

//第一种状态
//定义了一个对象
function Person() {
}
//第二种状态,这样赋值就会赋在原型对象中
//使用原型来给对象赋值
//这样就讲一个对象的属性和方法放在了该对象的原型中
//外界是无法访问到这样数据的
Person.prototype.name = 丽丽";
Person.prototype.age = 18;
Person.prototype.say = function() {
alert("姓名:"+this.name+",今年"+this.age+"岁了");
}
//第三种状态
var p1 = new Person();
//此时调用的是原型中的,因为自己中没有这些属性和方法
p1.say();//正常访问了
// say();//报错了
//可以通过如下的方式检测p1是不是指向Person的原型对象
// alert(Person.prototype.isPrototypeOf(p1))
var p2 = new Person();
p2.name = "李先生";
p2.age = 22;
p2.say();
1.1原型的内存模型如图:


1.2常见的原型检测方式

可以通过如下的方式检测p1是不是指向Person的原型对象
alert(Person.prototype.isPrototypeOf(p1))
//检测p1的构造器是否指向Person对象
alert(p1.constructor == Person)
//检测某个属性是不是自己内存中的
alert(p1.hasOwnProperty("name"));
alert(p2.hasOwnProperty("name"))
检测在某个对象中自己或者对应的原型中是否存在某个属性的方法:

alert("name" in p1);//true
delete p2.name;//true
alert("name" in p2);//true
//原型和自己中都没有sex属性
alert("sex" in p1);//false
1.3原型重写:
function Person() {
}
Person.prototype = {
name : "丽丽",
age : 18,
say : function() {
alert("我的名字是:"+this.name+",我今年"+this.age+"岁了");
}
}
var p1 = new Person();
p1.say()
var p2 = new Person();
p2.name = "李先生";
p2.age = 22;
p2.say();
这种方法是将对象的原型覆盖了。解决方法:手动指向Person:constructor:Person







猜你喜欢

转载自blog.csdn.net/meng_xiangfeng/article/details/53106342