![image](https://imgconvert.csdnimg.cn/aHR0cHM6Ly93d3cuaWJtLmNvbS9kZXZlbG9wZXJ3b3Jrcy9jbi93ZWIvMTMwNl9qaWFuZ2pqX2pzaW5zdGFuY2VvZi9maWd1cmUxLmpwZw?x-oss-process=image/format,png)
由图可看出绝大多数对象都继承自Object.prototype,还有例外继承自(0bject.create(原型))
定义:原型是function对象的一个属性,它定义了构造函数制造出的对象的公共祖先通过该构造函数产生的对象,可以继承该原型的属性和方法。原型也是对象
示例一:
Person.prototype.name = 'abc';
function Person() {
// 这里并非是创建一个this对象,只是为了表达new的时候有新对象生成
// var this = {
// __proto__ : Person.prototype
//}
}
var obj = {
name : "sunny"
}
var person = new Person();
person.__proto__ = obj; /改变指向
console.log(person.name); // sunny
示例二:
Person.prototype.name = 'sunny';
function Person() {}
var person = new Person ();
Person.prototype.name = "cherry";
console.log(person.name);//返回是cherry
// 底层原理
var obj = {name : 'a'};
var obj1 = obj;
obj = {name : 'b'};
继承模式
圣杯模式
var inherit = (function (){
var F = function(Target, Origin){};
return function(){
F.prototype = Origin.prototype;
Target.prototype = new F();
Target.prototype.constructor = Target;
Target.prototype.uber = Origin.prototype
}
}())
bind的源码实现
Function.prototype.newBind = function(target) {
let self = this
let args = [].slice.call(arguments, 1)
let temp = function() {}
let f = function() {
let _args = [].slice.call(arguments, 0)
return self.apply(this instanceof temp ? this : (target || window), args.concat(_args))
}
temp.prototype = self.prototype
f.prototype = new temp()
return f
}
let obj = {
x: 20
}
function show(x, y, z, w) {
console.log(this, x, y, z, w)
}
let newShow = show.newBind(obj, 2, 3, 4)
console.log(new newShow(1).constructor)