JavaScript构造函数一般首字母大写。
通过new一个构造函数来实例化对象,new之后的this才可指向此实例,
function Bird() {
this.name = "Albert";
this.color = "blue";
this.numLegs = 2;
}
let blueBird = new Bird();
可以扩展构造函数的参数,这样就不用每个属性单独赋值了,
function Bird(name, color) {
this.name = name;
this.color = color;
this.numLegs = 2;
}
let cardinal = new Bird("Bruce", "red");
实例化构造函数时,避免实例过多造成的重复定义相同变量,可以在原型上添加属性,但是修改prototype会删除原来的constructor,所以要添上,修改原型时不是手动修改对象,而是Bird.prototype.name='aa',则不用加constructor,
Bird.prototype = {
constructor = Bird,
leg = 2,
eat = function() {
console.log(111)
}
}
验证,
验证实例和构造函数,
canary instanceof Bird;
验证实例是否继承构造函数,
Bird.isPrototypeOf(canary)
验证对象的原型来自哪里
Bird.prototype.isPrototypeOf(duck);
验证自身属性,
canary.hasOwnPrototype(name)
超类,继承
待续
手写一个new
function Dog(name){
this.name = name
}
Dog.prototype.sayName = function(){
console.log(this.name)
}
function _new(fn,...args){
//先用Object创建一个空的对象,
const obj = Object.create(fn.prototype) //fn.prototype代表 用当前对象的原型去创建
//修改obj参数和this指向
const res = fn.call(obj, ...args)
//正常规定,如何fn返回的是null或undefined(也就是不返回内容),返回的是obj,否则返回res
//return typeof res === 'object' ? res : obj;
return res instanceof Object ? rel : obj
}
var _newDog = _new(Dog,'_new出来的dog')
_newDog.sayName()