JavaScript new和原型

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()

 

 

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

xyx107

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值