构造函数
1. 工厂函数
function createObj(name,age){
const obj = new Object()
obj.name = name
obj.age = age
return obj
}
const obj1 = createObj("小明",11)
const obj2 = createObj("小红",12)
console.log(obj1);
console.log(obj2);
2. 构造函数
function Fun(name,age){
this.name = name
this.age = age
}
Fun.prototype.sayHi = function(){
console.log("你好"+this.name);
}
const fun1 = new Fun("tom",12)
const fun2 = new Fun("jack",13)
fun1.sayHi()
fun2.sayHi()
3. 显式原型和隐式原型
- 所有函数都有一个属性
prototype
, 这个属性指向一个空对象, 这个空对象, 叫做原型对象 - 使用函数new出来一个对象, 这个函数被叫做构造函数, new出来的对象称为实例对象, 每个实例对象都有一个属性
__proto__
, 这个属性也指向原型对象 - 构造函数的属性
prototype(称为显式原型)
和用它new
出的实例对象的属性__proto__(称为隐式原型)
, 它们的指向是同一个原型对象
function Fun(){
this.name = "我的名字叫函数"
}
Fun.prototype.age = 20
Fun.prototype.text = function(){
console.log("text()");
}
const fun = new Fun()
console.log(fun.__proto__ === Fun.prototype);
console.log(fun.age)
fun.text()
4. constructor
- 对象的
__proto__
中有一个属性叫做constructor
- 这个属性就是指向当前这个对象所属的构造函数
function Fun(){
}
Fun.prototype.name = "123"
const fun = new Fun()
console.log(Fun.prototype);
console.log(Fun.prototype.constructor === Fun);
console.log(fun.__proto__.constructor === Fun);
console.log(fun.constructor === Fun);
5. 原型链
function Fun(){
}
Fun.prototype.age = 20
const fun = new Fun()
fun.name = "小红"
console.log(fun.name)
console.log(fun.age)
console.log(fun.toString())
console.log(Fun.prototype.__proto__)
console.log(Object.prototype.__proto__);
6. 对象的赋值
- 到这里,我们就会觉得,如果是赋值的话,那么也会按照原型链的规则来
- 但是: 并不是!并不是!并不是! 重要的事情说三遍
- 赋值的时候,就是直接给对象自己本身赋值
- 如果原先有就是修改
- 原先没有就是添加
- 不会和
__proto__
有关系