原型 原型链

function P() {}
var p1 = new P();
P.prototype.age = 18;
P.prototype = {
    constructor: P,
    name: 'zz'
}
P.prototype.num = 20;
P.prototype.age = 22;
console.log(p1.name);
console.log(p1.age, 'dd');
console.log(p1.num);
var p2 = new P();
console.log(p2.name);
console.log(p2.num);
console.log(p2.age);

里面依次输出为:
undefined;18,'dd';undefined;zz;20;22
分析:
这里主要考察的是,实例到是跟哪个原型对象有委托关系的;
首先p1是跟原P的原型对象有委托关系,即他会有age;
但是后面P重写了原型,P.prorotype会创建一个新的原型对象,而p1.__proto__仍然指向原来的那个旧的原型对象;
所以p1的name,num都是undefind,他是指向旧的原型链,而旧的原型链上没有这些属性。
p2实例化的时候,原型已经重写了,p2.__proto__指向新的原型对象,会有重写之后的属性,如name,num,新age;
即可以通过原型链上看

console.log(p1.__proto__ === P.prototype); //false

console.log(p2.__proto__ === P.prototype); //true

function name(params) {
    this.coco=params;
}
var n1=new name("ccc");
name.prototype.test='ttt';
console.log(n1);
console.log(n1.test);
实例化就是constructor(构造器)里面的prototype的东西,放在__proto__里了去




实例成员: 实例成员就是在构造函数内部,通过this添加的成员。实例成员只能通过实例化的对象来访问。
静态成员: 在构造函数本身上添加的成员,只能通过构造函数来访问

function Star(name,age) {
    //实例成员
    this.name = name;
    this.age = age;
}
//静态成员
Star.sex = '女';
let stars = new Star('小红',18);//stars 实例化对象;Star构造函数
console.log(stars); // Star {name: "小红", age: 18}
console.log(stars.sex); // undefined 实例无法访问sex属性
console.log(Star.name); //Star 通过构造函数可直接访问实例成员
console.log(Star.sex); //女 通过构造函数可直接访问静态成员

构造函数每个实例的调用的同名方法不是同一个函数,都是新开辟一个内存空间存方法。

function Star() {
    this.sing = function () {
        console.log('我爱唱歌');
    }
}
let stu1 = new Star();
let stu2 = new Star();
stu1.sing();//我爱唱歌
stu2.sing();//我爱唱歌
console.log(stu1.sing === stu2.sing);//false    

构造函数可以通过原型上分配对象,实现对象共享。

function Star(name) {
    this.name = name;
}
Star.prototype.sing = function () {
    console.log('我爱唱歌', this.name);
};
let stu1 = new Star('小红');
let stu2 = new Star('小蓝');
stu1.sing();//我爱唱歌 小红
stu2.sing();//我爱唱歌 小蓝
console.log(stu1.sing === stu2.sing);//true

原型是什么? Star.prototype就是原型,它是一个对象,我们也称它为原型对象。
原型的作用是什么? 共享方法。
实例化的对象的__proto__是构造函数的prototype(原型对象)
原型的构造器constructor ,原型对象的构造器指向构造函数

function Star(name) {
    this.name = name;
}
let obj = new Star('小红');
console.log(Star.prototype.constructor === Star);//true
console.log(obj.__proto__.constructor === Star); //true
即obj._proto_(属性)==Star.prototype(原型对象)
function Person() {
}
console.log(Person === Person.prototype.constructor); // true

 原型的最顶层是Object.prototype;

后代不能增删改,祖先的原型上的属性;



原文地址:https://www.cnblogs.com/ssszjh/p/12915229.html