原型
概述
在JavaScript中,函数是一个包括属性和要领的Function范例的对象。而原型(Prototype)就是Function范例对象的一个属性。
在函数定义时九包括了prototype属性,他的初始值是一个空对象。在JavaScript中并没有定义函数的原始范例,所以原型可所以任何范例。
原型是用于保留对象的同享属性和要领的,原型的属性和要领并不会影响函数自身的属性和放大。
猎取原型
1.经由过程组织函数的prototype属性
function fn(){
console.log('this is function');
}
console.log(fn.prototype);
2.经由过程Object对象的getgetPrototypeOf()要领
function fn(){
console.log('this is function');
}
console.log(Object.getPrototypeOf(fn));
为原型新增属性或要领
- 组织函数.prototype.属性名 = 属性值
组织函数.prototype.要领名 = function(){} - 组织函数.prototype = {
属性名:属性值,
要领:function(){}
}
组织函数的原型
/*定义组织函数*/
function Fun(){
this.name = 'segment';
this.sayMe = function(){
console.log('this is function');
}
}
//操纵组织函数Fun的原型
Fun.prototype.age = 18;
// 应用组织函数来建立对象
var fun = new Fun();
console.log(fun);
// 为组织函数的原型新增的属性 -> 组织函数建立的对象中照旧能够接见
console.log(fun.age);// 18
// 对象fun中不存在age属性
var result = Object.getOwnPropertyDescriptor(fun, 'age');
console.log(result);
自有属性和原型属性
自有属性:组织函数自身的属性
原型属性:经由过程原型所定义的属性
function Mingzi (name){
this .name = name;
this .sayMe = function(){
console .log('this is function')
}
}
Mingzi.prototype.age = 18;
var mingzi = new Hero('石原');
console.log(mingzi.name);// 石原
console.log(mingzi.age);// 18
var mingzi2 = new Mingzi('长泽雅吗');
console.log(mingzi2.name);// 长泽雅美
console.log(mingzi2.age);// 18
Hero.prototype.age = 80;
console.log(mingzi.age);
console.log(mingzi2.age);
重写属性
经由过程组织函数或对象的自有属性能够重写原型的属性
自有属性与原型属性同名时,默许接见的是自有属性
// 定义组织函数
function Hero(){
this.name = '张无忌';
}
// 组织函数的原型
Hero.prototype.name = '周芷若';
// 组织函数建立对象
var hero = new Hero();
console.log(hero.name);// 张无忌
// 删除对象的属性
delete hero.name;
// 从新接见对象的属性
console.log(hero.name);// 周芷若
检测原型的属性
Object.hasOwnProperty(prop)要领
作用 – 推断当前指定属性是不是为自有属性
参数1.prop – 示意指定属性称号
2.返回值 - 布尔值
true - 示意存在指定的自有属性
false - 示意不存在指定的自有属性
运用in关键字检测对象的属性
作用 – 推断对象中是不是存在指定属性(自有属性或原型属性)
返回值 – 布尔值
true - 示意存在指定的属性
false - 示意不存在指定的属性
显现原型与隐式原型
每一个函数function都有一个prototype,即显式原型
每一个实例对象都有一个__proto__,可称为隐式原型
对象的隐式原型的值为其对应组织函数的显式原型的值
函数的prototype属性: 在定义函数时自动增加的, 默许值是一个空Object对象
对象的__proto__属性: 建立对象时自动增加的, 默许值为组织函数的prototype属性值
我们能直接操纵显式原型, 但不能直接操纵隐式原型