原型
概述
在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属性值
我们能直接操作显式原型, 但不能直接操作隐式原型