原型 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的原型链
实例化对象的原型链