//每个对象都有一个prototype(原型属性),
//这个属性是另外一个对象的引用
//这个属性其实就是一个对象
//它的用途是包含可以由特定类型的所有实例共享的属性和方法
//构造函数的写法
function Box(name,age)
{
this.name = name; //实例属性
this.age = age; //实例方法
this.run = function()
{
return this.name + this.age + "运行中";
};
}
//原型方法创建对象
//构造函数函数体内什么都没有,
//这里如果有,叫做实例属性,实例方法
function Box(){}
Box.prototype.name = "Lee"; //原型属性
Box.prototype.age = 100; //原型属性
Box.prototype.run = function() //原型方法
{
return this.name + this.age + "运行中...";
}
var box1 = new Box();
var box2 = new Box();
//alert(box1.name);
//alert(box1.run());
//如果是实例方法,不同的实例化,他们的方法地址是不一样的,是唯一的
//如果是原型方法,那么他们地址是共享的,大家都是一样的
//地址一样
alert(box1.run == box2.run);
//原型方法创建对象
//构造函数函数体内什么都没有,
//这里如果有,叫做实例属性,实例方法
function Box(){}
Box.prototype.name = "Lee"; //原型属性
Box.prototype.age = 100; //原型属性
Box.prototype.run = function() //原型方法
{
return this.name + this.age + "运行中...";
}
var box1 = new Box();
var box2 = new Box();
//创建每个对象都有prototype属性 打印undefined
//但是他会产生__proto__属性
//__proto__其实就是prototype 只不过是prototype这个对象的指针属性
//prototype这个属性是个对象,访问不到
alert(box1.prototype);
//__proto__这个属性是一个指针指向prototype原型对象
alert(box1.__proto__); //打印出[Object object] 在IE浏览器不支持
//constructor 是构造函数的原型属性 叫做构造属性
alert(box1.constructor); //构造属性,可以获取构造函数本身
//作用是被原型指针定位,然后得到构造函数本身
//其实就是对象实例对应的原型对象的作用
//原型方法创建对象
//构造函数函数体内什么都没有,
//这里如果有,叫做实例属性,实例方法
function Box(){}
Box.prototype.name = "Lee"; //原型属性
Box.prototype.age = 100; //原型属性
Box.prototype.run = function() //原型方法
{
return this.name + this.age + "运行中...";
}
var box1 = new Box();
var box2 = new Box();
//判断一个对象实例(对象引用)是不是指向了对象的原型对象,基本上只要实例化了,他是自动指向的
alert(Box.prototype.isPrototypeOf(box1));
var obj = new Object();
alert(Box.prototype.isPrototypeOf(obj));
//原型模式的执行流程
//1.先查找构造函数实例里的属性和方法,如果有,立刻返回
//2.如果构造函数实例没有,则去它的原型对象里找,如果有,就返回
function Box()
{
this.name = "Jack";
}
Box.prototype.name = "Lee"; //原型属性
Box.prototype.age = 100; //原型属性
Box.prototype.run = function() //原型方法
{
return this.name + this.age + "运行中...";
}
var box1 = new Box();
var box2 = new Box();
//box1.name = "Jack"; //实例属性,并没有重写原型属性
alert(box1.name); //就近原则
//实例属性不会共享,所以box2访问不到实例属性,那就只能访问原型
alert(box2.name);
delete box1.name //删除实例中的属性
alert(box1.name); //可以访问原型中的属性
//delete Box.prototype.name //删除原型中的属性
Box.prototype.name = "KKK"; //覆盖原型中的属性
alert(box1.name);
function Box()
{
}
Box.prototype.name = "Lee"; //原型属性
Box.prototype.age = 100; //原型属性
Box.prototype.run = function() //原型方法
{
return this.name + this.age + "运行中...";
}
var box1 = new Box();
box1.name = "Kac";
//判断实例中是否存在指定属性
alert(box1.hasOwnProperty("name"));
//不管实例属性、原型属性是否存在只要有返回true
//否则返回false
alert("name" in box1);
//判断只有原型中有属性
function isProperty(object,property)
{
//实例中没有且在(原型或实例)中都有
return (!object.hasOwnProperty(property)&&(property in object))
}
alert(isProperty(box1,"name"));