原型
在JS中 函数是一个包含属性和方法的Function类型的对象 原型prototype就是Function类型对象的一个属性
每个函数都有一个prototype属性, 它默认指向一个Object空对象---即:原型对象
原型对象中有一个属性constructor, 它指向函数对象
原型是用于保存对象的共享属性和方法的 原型的属性和方法并不会影响函数本身的属性和方法
function fn(){
return 'hello'
}
console.log(typeof fn.prototype) //object
获取原型
- 通过构造函数的prototype属性
function fn(){
console.log('this is a function')
}
console.log(fn.prototype); //{constructor: ƒ}
- 通过Object对象的getgetPrototypeOf()方法
function fn(){
console.log('this is a function')
}
console.log(Object.getPrototypeOf(fn)); //ƒ () { [native code] }
原型的属性和方法
- 原型的属性和方法单独进行定义
构造函数.prototype.属性名 = 属性值
构造函数.prototype.方法名 = function(){
}
- 直接为原型定义一个新对象
构造函数.prototype = {
属性名:属性值,
方法:function(){}
}
自有属性与原型属性
自有属性:通过对象的引用添加的属性
原型属性:从原型对象中继承而来 如果原型对象中属性值改变 则所有继承
自该原型的对象属性都改变
function Person(name){
//构造函数本身的属性 --> 自有属性
this.name = name;
}
//通过构造函数Person的prototype新增属性 --> 原型属性
Person.prototype.age=29
var man=new Person('林更新');
console.log(man.name); //林更新
console.log(man.age) //29
var woman=new Person('宋佳');
woman.age=38;
console.log(woman.name) //宋佳
console.log(woman.age) //38
Person.prototype.age=18;
console.log(man.age) //18
console.log(woman.age) //38
检测自有 原型属性
- 使用hasOwnProperty()方法检测对象是否具有指定的自有属性
function Person() {
}
var man =new Person()
console.log(man.hasOwnProperty("name")) //false
- 使用in关键字检测对象及其原型链中是否具有指定属性
function Person() {
}
var man =new Person()
console.log("name" in man) //false
显示原型对象和隐式原型对象
- 每个函数function都有一个prototype,即显式原型
- 每个实例对象都有一个__proto__,可称为隐式原型
- 对象的隐式原型的值为其对应构造函数的显式原型的值
- 函数的prototype属性: 在定义函数时自动添加的, 默认值是一个空Object对象
- 对象的__proto__属性: 创建对象时自动添加的, 默认值为构造函数的prototype属性值
- 我们能直接操作显式原型, 但不能直接操作隐式原型(ES6之前)
function Person() {
this.name='MasterYi'
}
Person.prototype.age=100;
var man=new Person;
console.log(man.prototype); // undefined 表示对象中不存在该属性
console.log(man.__proto__); // {age: 100, constructor: ƒ}
原型链
- 访问一个对象的属性时,先在自身属性中查找,找到返回
- 如果没有, 再沿着__proto__这条链向上查找, 找到返回
- 如果最终没找到, 返回undefined
- __proto__这条原型查找链就是原型链: 隐式原型链
- 读取对象的属性值时: 会自动到原型链中查找
- 设置对象的属性值时: 不会查找原型链, 如果当前对象中没有此属性, 直接添加此属性并设置其值
- 方法一般定义在原型中, 属性一般通过构造函数定义在对象本身上
作用:用来查找对象的属性(方法)
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。