-
原型的来源
面向对象编程中,有‘继承’
机制能够实现子类继承父类的属性及方法。但Javascript里面所有数据类型都是对象,且没有类(class)
的概念(ES6中添加了类Class,在之前是没有),为了解决数据共享,Javascript的作者提出了原型
的概念。
-
原型定义
原型(prototype)
被定义为:给其他对象提供共享属性的对象。
函数(function)
:函数是一种特殊的对象,函数的原型存放在prototype属性上
对象(Object)
: 普通对象的原型是存放到内置属性[[Prototype]]上,可以通过对象的__proto__
来访问对象的原型。
数组(Array)
: 数组也是一种特殊的对象,但与函数不同的是它的原型和普通对象一样,也是存放到内置属性[[Prototype]]上,可以通过数组的__proto__
来访问数组的原型。
原型创建
函数原型的创建
let Person = function(name,age){
this.name=name;
this.age=age;
};
Person.prototype.xp = all;
Person.prototype.sayHello = function(){
console.log('你好,我是函数原型上的方法');
}
let p1 = new Person();
let p2= new Person();
p1.xp //all
p2.sayHello() //你好,我是函数原型上的方法
//Es6 class写法
class Person{
constructor(name,age){
this.name=name;
this.age=age;
}
sayhello(){
console.log("你好,我是函数原型上的方法")
}
}
Person.prototype.xp="all";
let p1=new Person();
构造函数通过new
创建对象,对象通过__proto__
属性指向他的原型,原型中有所有对象的公用的属性及方法,原型只能通过构造函数来创建对象,构造函数可以通过prototype
属性指向原型。每个对象都原型,每个原型都有构造函数。
对象原型的创建
let obj = {};
console.log(obj);
console.log(obj.__proto__);
数组原型的创建
let arr = [];
console.log(arr);
console.log(arr.__proto__);
-
原型链定义
原型本身有一个内部指针指向另一个原型,相应地另一个原型也有一个指针指向另一个构造函数。这样就在实例和原型之间构造了一条原型链。这就是原型链的基本构想。
class Person {
constructor(name, age) {
this.name = name;
this.age = age;
}
sayHello() {
console.log("Hello, l' m " + this.name);
}
}
Person.prototype.xp="all";
let c1 = new Person('Doraniko', 666);
原型有自己__proto__
属性,它指向Object原型。js中所有的对象继承自Object,它的__proto__
指向为null,一个基础的原型链就基本形成。
注:对象由Object构造函数隐式创建,其原型就是Object.prototype
class Person {
constructor(name, age) {
this.name = name;
this.age = age;
}
sayHello() {
console.log("Hello, l' m " + this.name);
}
}
class Coder extends Person {
constructor (name, age) {
super(name, age);
}
icu() {
return 996;
}
}
let c1 = new Coder('Doraniko', 666);
c1.toString() // Object.prototype
c1.sayHello() // Person.prototype
c1.icu() //Coder.prototype
一个类继承另一个类,子类的原型会指向父类的的原型,只有原型才可以继承。对象可以使用原型链上游的所有的属性及方法。