构造函数添加属性和方法的两种方式(含义是不一样的,优先获取构造函数的属性和方法)
注意
new一个实例的话,使用实例的属性和方法,首先看构造函数定义了该属性和方法没有,有的话优先使用,没有的话再向构造函数的原型链prototype上查找该属性和方法
// 创建一个构造函数
function person2() {
this.name = "小连";
this.addnum = function () {
console.log(22);
};
}
var p2 = new person2();
console.log(p2.name);
p2.addnum();
// 创建一个构造函数
function person1() {}
// 在该构造函数的原型prototype上面定义一个属性或方法
person1.prototype.username = "小明";
person1.prototype.addnum = function () {
console.log(23);
};
var p1 = new person1();
console.log(p1.username);
p1.addnum();
对应面试题
function A() {}
function B(a) {
this.a = a;
}
function C(a) {
if (a) {
this.a = a;
}
}
A.prototype.a = 1;
B.prototype.a = 1;
C.prototype.a = 1;
console.log(new A()); //A {}
console.log(new B()); //B { a: undefined }
console.log(new B(2)); //B { a: 2 }
console.log(new C()); //C {}
console.log(new C(2)); //C { a: 2 }
console.log("---");
console.log(A.prototype); //A { a: 1 }
console.log(B.prototype); //B { a: 1 }
console.log(C.prototype); //C { a: 1 }
console.log("---");
console.log(new A().a); //1
console.log(new B().a); //undefined
console.log(new B(2).a); //2
console.log(new C().a); //1
console.log(new C(2).a); //2
// 得出的结论new一个实例的话,使用实例的属性和方法,首先看构造函数定义了该属性和方法没有,有的话优先使用,没有的话再向构造函数的原型链prototype上查找该属性和方法
构造函数
function person2() {
this.name = "小连";
this.addnum = function () {
console.log(22);
};
}
var p2 = new person2();
console.dir(p2);
console.dir(person2);
console.log("---");
console.log(p2.__proto__);
console.log(person2.prototype);
console.log(p2.__proto__ === person2.prototype);