JavaScript
常被描述为一种基于原型的语言 (prototype-basedanguage)——每个对象拥有一个原型对象,对象以其原型为模板、从原型继承方法和属性。
原型对象也可能拥有原型,并从中继承方法和属性,一层一层、以此类推。这种关系常被称为原型链
(prototype chain),它解释了为何一个对象会拥有定义在其他对象中的属性和方法。
准确地说,这些属性和方法定义在Object的构造器函数(constructorfunctions)之上的prototype属性上,而非对象实例本身。通过原型这种机制,JavaScript 中的对象从其他对象继承功能特性
- 在javascript中,每个函数都有一个特殊的属性叫作原型(prototype)
- 对象的原型可以通过
Object.getPrototypeOf(obj)
或者已被弃用的__proto__
属性获得 prototype
是函数才有的属性,__proto__
属性是对象的属性,大多数情况下,__proto__
可以理解为“构造器的原型”,即__proto__===constructor.prototype
,但是通过Object.create()
创建的对象有可能不是.
Object.create()方法创建一个新对象,使用现有的对象来提供新创建的对象的__proto__。
function Constructor(){}
o = new Constructor();
// 等价于:
o = Object.create(Constructor.prototype);
let obj1 = { a: 1 };
let obj2 = Object.create(obj1);
console.log('obj2.constructor',obj2.constructor)
console.log("obj2.__proto__:",obj2.__proto__); //Object {a: 1}
Object.getPrototypeOf(obj)
在ES5中,如果传递给方法的参数不是对象,则会抛出TypeError异常。
在ES6中,如果传递给方法的参数不是对象,则会强制类型转换为对象。
原型继承、构造函数继承、组合继承
ES5实现继承
- 原型链(无法设置参数)
- 借用构造函数
- 组合继承
- 原型式继承
- 寄生式继承
- 寄生组合式继承
ES6实现继承
原型链继承(无法设置参数)