JavaScript深入之从原型到原型链

//Person是构建函数
function Person() {
}
//构建了实例对象person
var person = new Person();
person.name= 'kevin';
console.log(person.name) //kevin

prototype

//Person是构建函数
function Person() {
}

Person.prototype.name = '222';

var person1 = new Person();
var person2 = new Person();

console.log(person1.name)
console.log(person2.name);

函数的prototype属性指向了一个对象,这个对象正是调用该构建函数而创建的实例的原型,也就是 这个例子中person1和person2的原型

原型: 每一个JavaScript对象(null除外)在创建的时候就会与之关联另一个对象,这个对象 就是我们所说的原型,每一个对象都会从原型"继承"属性.

proto

每一个 JavaScript对象(除了null),都会有一个属性__proto__,指向对象的原型

function Person() {
}
var person = new Person();
console.log(person.__proto__ === Person.prototype) //true

它并不存在与Person.prototype中,实际,它来自于Object.prototype,于其说是一个属性,不如说她是一个getter/setter, 当时用obj.__proto__时,可以理解为返回Object.getPrototypeOf(obj)

constructor

每一个原型都有一个 constructor属性指向关联的构造函数

function Person() {
}
console.log(Person === Person.prototype.constructor)
//true
//person中没有constructor属性,要从原型Person.prototype中去找,正好原型中会有,
console.log(person.constructor === Person);
console.log(person.constructor === Person.prototype.constructor)

到此为止得出的结论

function Person() {
}
var person = new Person();
console.log(person.__proto__ === Person.prototype) //true

console.log(Person === Person.prototype.constructor)
//true
console.log(Object.getPrototypeOf(person) === Person.prototype)

原型的原型

var obj = new Object()
    obj.name ="kevin";
console.log(obj.name);

原型链

Object.prototype === null null 代表没有对象,即该出不应该有值 所以 Object.prototype.proto 为null 和 Object.prototype 没有原型,其实表达了

##真的是继承吗 继承意味着复制操作,然而Javascript默认并不会复制对象属性,相反,JavaScript只是在两个对象之间创建一个关联, 这样,一个对象就可以通过委托访问另一个对象的属性和函数,所以与其叫继承,委托的说法反而更准确一些.

参考: https://github.com/mqyqingfeng/Blog/issues/2