JS:原型

在这里插入图片描述

1.原型

每个函数都拥有一个属性 prototype ,这个属性的值是一个普通对象,称为原型对象。

2.实例

instance ,通过 new 产生的对象称为实例。

由于 JS 中所有对象都是通过 new 产生的,因此,JS 中所有对象都称为实例

3.隐式原型

每个实例都拥有一个属性 __ proto __ ,称为隐式原型,它指向构造函数的原型。

节省内存:
当访问实例成员时,先找自身,如果不存在,则自动从隐式原型中寻找。因此,我们只要将公共成员,放到函数的原型中,该成员就可以被所有实例共享。

function Person(name,age) {
	this.name = name;
	this.age = age;
}
Person.prototype.print = function() {
	console.log(this.name + '今年' + this.age + '岁');
}
let person1 = new Person('张三', 18);
let person2 = new Person('李四', 20);
person1.print(); //张三今年18岁
person2.print(); //李四今年20岁

hasOwnProperty 和 in:

Object.prototype.c = 3;
let obj = {
	a: 1,
	b: 2
}
//判断实例成员是否属于自身:hasOwnProperty
obj.hasOwnProperty('a'); //true
obj.hasOwnProperty('c'); //false
//判断成员是否属于实例自身或其隐式原型:in
'a' in obj; //true
'c' in obj; //true

new一个对象的过程:

function myNew() {
	//1.创建一个空对象
	let obj = {};
	//2.取出 arguments 中的第一个参数,即构造函数
	//arguments 不是数组,不能调用数组的方法,
	//用call调用了数组的shift方法,移除了arguments的第一个参数,返回这个移除的参数,赋值给constructor)
	let constructor = [].shift.call(arguments);
	//3.连接原型
	obj.__proto__ = constructor.prototype;
	//4.执行构造函数,绑定 this, 并添加属性
	constructor.apply(obj, arguments);
	//5.返回该对象
	return obj;
}

function Person(name, age) {
	this.name = name;
	this.age = age;
}

let person1 = myNew(Person, '张三', 18);
console.log(person1.name,person1.age); //张三 18

4.原型链

在这里插入图片描述
Object.create(proto, propertiesObject):
用于创建一个新对象,使用现有的对象来作为新创建对象的原型(prototype)。

proto:
新创建对象的原型对象。

propertiesObject: (可选)
如果该参数被指定且不为 undefined,则该传入对象的自有可枚举属性(即其自身定义的属性,而不是其原型链上的枚举属性)将为新创建的对象添加指定的属性值和对应的属性描述符。这些属性对应于 Object.defineProperties() 的第二个参数。

5.继承

function Person(name, age) {
	this.name = name;
	this.age = age;
}
Person.prototype.eat = function() {
	console.log('吃饭');
}

function Student(/*name,age,*/grade, score) {
	// Person.call(this,name,age);
	this.grade = grade;
	this.score = score;
}
Student.prototype = new Person('张三', 18);
let student1 = new Student('三年级', '90分');
//将 Student.prototype 的隐式原型 __proto__ 指向 Person.prototype
// Object.setPrototypeOf(Student.prototype,Person.prototype);
// let student1 = new Student('张三', 18,'三年级', '90分');
Student.prototype.test = function() {
	console.log('考试')
}

//张三 18 三年级 90分
console.log(student1.name, student1.age, student1.grade, student1.score); 
student1.eat(); //吃饭
student1.test(); //考试
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值