一、原型对象prototype、对象原型__proto__
代码:
function TV(uname, uyear) {
this.uname = uname;
this.uyear = uyear;
}
//利用构造函数创建对象,new 一下TV 构造函数创建clj实例对象
var clj = new TV('《苍兰诀》', 2022);
TV.prototype.sing = function() {
console.log("歌曲要收费");
};
TV.prototype.actor = function() {
console.log("新人演员");
};
// console.dir(obj3.__proto__ === TV.prototype); //true 对象原型===原型对象
console.log(TV.prototype);
console.log(clj.__proto__);
console.log(TV.prototype.constructor);
console.log(clj.__proto__.constructor);
结果:
二、
代码:
// 抽取对象的公共部分做成一个模板
function TV(uname, uyear) {
this.uname = uname;
this.uyear = uyear;
}
//利用构造函数创建对象,new 一下TV 构造函数创建clj实例对象
var clj = new TV('《苍兰诀》', 2022);
//1.这种属于直接给的对象添加方法,并不需要其他修改
// TV.prototype.sing = function() {
// console.log("歌曲要收费");
// };
// TV.prototype.actor = function() {
// console.log("新人演员");
// };
// 2.采用对象的形式进行存储方法,
// 这种情况相当于修改了原来的原型对象,给原型对象赋了一个对象,
// 这种必须手动修改constructor指回原来的构造函数
TV.prototype = {
constructor: TV, //手动指回
sing: function() {
console.log("歌曲要收费");
},
actor: function() {
console.log("新人演员");
}
};
// console.dir(obj3.__proto__ === TV.prototype); //true 对象原型===原型对象
console.log(TV.prototype);
console.log(clj.__proto__);
console.log(TV.prototype.constructor);
console.log(clj.__proto__.constructor);
结果:
三、上述总结
1.区别
TV.prototype.sing = function(){
}
TV.prototype = {
sing : function(){
}
}
这两种写法是不一样的,前者是添加,后着是重新赋值。
2.构造函数、实例、原型对象三者关系
四、整理黑马
原型链
Object是顶层了,再往上就找不到原型了。
原型链为查找对象成员(属性或方法)提供了一条路,可以一路往上找,找到就返回找到的(属性或方法),最后找不到就返回undefined。
案例演示: