js中原型,原型链

原型 prototype

1.每一个构造函数被创建,系统都会自动创建一个与构造函数相对应的prototype对象,这个对象叫做原型

2.访问原型的对象方法 构造函数.prototype

3.构造函数的原型是一个对象 可以添加属性和方法

4.往原型中添加的方法该构造函数实例化的对象可以访问

function Person(name,age){
    this.name = name;
    this.age = age;
}

Person.prototype.sayHi = function(){
    console.log("大家好,我是"+this.name);
}
var p1 = new Person("Smith",24);

注意点:

1.共有属性和方法 是所有实例化的对象都有这个属性 并且属性都一样

2.构造函数访问对象规则 原型 构造函数名.prototype

最先访问实例化对象自己的 如果没有 就访问构造函数里面的 如果没有 就访问原型里面的(就近原则)

        function Dog(name, breed) {
            this.name = name;
            this.breed = breed;
            // 构造内部方法
            this.sayHi = function () {
                console.log("我是构造函数里的sayHi方法");
            }
        }
        // 构造函数原型里面的
        Dog.prototype.sayHi = function () {
            console.log("我是原型里的方法");
        }
        var d1 = new Dog("小黄", "柯基");
        d1.sayHi(); // 我是构造函数里的sayHi方法

3.修改原型中的方法 访问原型 必须使用构造函数名.prototype

4.原型可以使用另外一个对象来替换 那么实例化对象后 调用原型中的方法 是替换前还是替换后

取决于实例化对象操作是在原型替换前还是原型替换后

        function Person(name,age){
            this.name = name;
            this.age = age;
        }
        // 给原型添加一个方法
        Person.prototype.sayHi = function(){
            console.log("大家好,我是"+this.name);
        }
        // 替换原型
        Person.prototype = {
            sayHi : function(){
                console.log("我是原型替换后的sayHi方法");
            }
        }
        var p1 = new Person("lucy",18);
        p1.sayHi();    // 我是原型替换后的sayHi方法
对象原型 ____proto

proto 属于构造函数实例化对象的一个属性

这个属性指向实例化这个对象的构造函数的原型

可以这样来操作构造函数的原型 但是不推荐使用 而且 proto 不是w3c的标准语法 开发不适用

console.log(p1.__proto__ === Person.prototype); // true
constructor属性

constructor 是属于构造函数原型里的一个属性 指向构造函数

console.log(Person.prototype.constructor === Person);   //true

**注意:**替换原型之后 会有丢失constructor属性的现象 所以要找回来

Person.prototype = {
    type : "人类",
    constructor : Person
}
// 手动给了constructor属性后 又指回原来的构造函数
console.log(Person.prototype.constructor === Person); // true
原型链

我们创建的每一个对象 都有一个原型 这个原型也是对象 所以原型也有原型

这就形成了一个原型链

例如.toString()方法

function Student(name,age){
    this.name = name;
    this.age = age;
}    

Student.prototype.read = function(){
    console.log("大家好,我是"+this.name + "我在敲代码");
}

var s1 = new Student("Jack",19);
s1.read();

// s1.study();  // 报错
console.log(s1.toString()); // [object Object]

对象自己里面没有定义toString()方法 构造函数的原型里也没有 但没有报错

对象访问某个成员 先在自己里面找 如果没有 就去构造函数里找 构造函数里没有就去原型里找

原型里没有就沿着原型链网上找 找到最后 找到null 还没有就报错或undefined

console.log(s1.__proto__.constructor);  // 构造函数 Student对象
console.log(s1.__proto__.__proto__.constructor);  // Object对象
console.log(s1.__proto__.__proto__ === Object.prototype);   // true
console.log(s1.__proto__.__proto__.__proto__);  // null

构造函数实例化对象的原型链在这里插入图片描述

自定义构造函数的原型链在这里插入图片描述
function的原型链
在这里插入图片描述
实例化对象的原型链
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值