原型链相关知识

先说构造函数

比如我想创建很多个user对象,一个一个创建太麻烦,弄个工厂函数

function user (name, age, sex) {
var person = {};
person.age = age;
person.name = name;
person.sex = sex;
return person;
}
//这是一个工厂函数
var whh = user('whh', 20, 'female');
console.log(whh);//获得一个对象

在Js中原生就有一种更加方便的生成对象的函数,主义要new,构造器构造函数,第一个字母大写
在这里插入图片描述

再说_ _proto__和prototype

生成对象的过程叫做实例化
在这里插入图片描述
对象由该函数生成,对象下面有_ proto _ 隐性属性,继承自构造函数的prototype。可以把greet方法/属性放在User.prototype里,那么实例化的对象都有这个隐性属性。 对象在用的时候可以像自己的东西一样用
prototype给他即将生成的对象继承下去的属性。可以更改动态更新。

对象下面有_ proto _和constructor
new whh.constructor(‘yo’) 生成一个相同的新用户;

原生对象的原型

var a = {};
其实就是
var b = new Object();  (Object也是函数)
第一行只是一个快捷方式。
a.__proto__ = b.__proto__

var c = [];
c.__proto__ == Array.prototype
里面有很多方法,比如push,shift,constructor等等
c.__proto__.constructor == Array()
c.__proto__.__proto__ == Array.prototype.__proto__ == Object.prototype
c可以用爸爸,爷爷的方法
如果想创建一个感觉的对象,孤儿
var a = Object.create(null)

构造函数没有__proto__
构造函数的prototype是个对象,有__proto__
Object.create()方法创建一个新对象,使用现有的对象来提供新创建的对象的__proto__

多级继承怎么实现

// 动物 》哺乳动物 》人类 》lsd

function Animal (color, weight) {
  this.color = color;
  this.weight = weight;
}

Animal.prototype.eat = function () {
  console.log('mia mia mia...');
}

Animal.prototype.sleep = function () {
  console.log('zzz...');
}

// var a = new Animal('black', 120);
// console.log('a:', a);

function Mammal(color, weight) {
  Animal.call(this, color, weight);
}

Mammal.prototype = Object.create(Animal.prototype);
Mammal.prototype.constructor = Mammal;
Mammal.prototype.suckle = function () {
  console.log('mia!好!');
}

// var m = new Mammal('black', 100);
// console.log('m:', m);

function Person(color, weight) {
  Mammal.call(this, color, weight);
}

Person.prototype = Object.create(Mammal.prototype);//覆盖
Person.prototype.constructor = Person;//constructor归位
Person.prototype.lie = function () {//加新属性
  console.log('你不帅');
}

var lsd = new Person('brown', 100);
var whh = new Person('brown', 80);
console.log('lsd:', lsd);
console.log('whh:', whh);

Mammal继承Animal后,再给Animal的prototype增加方法/变量,Mammal仍然可以继承到,因为是Mammal.prototype是个对象,引用类型
显示属性,this指定的是拷贝下去的,所以互不影响
在这里插入图片描述
总结
在这里插入图片描述

new一个对象的过程发生了什么

  • 将this指向创建完的实例(执行环境)
  • 将对象的__prop__指向构造函数的prototype
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值