原型对象
1.构造函数new的工作原理
(1)了解工厂函数
作用:用于批量创建对象的函数
//工厂函数 :解决创建多个代码对象冗余
function createPerson (name, age, sex) {
//(1)创建空对象
let p = {}
//(2)对象赋值
p.name = name
p.age = age
p.sex = sex
//(3)返回创建好的对象
return p
}
let p1 = createPerson('ikun', 32, '男')
let p2 = createPerson('班长', 38, '男')
let p3 = createPerson('王悦', 28, '男')
console.log(p1, p2, p3)
(2)构造函数 原理:使用new关键字调用一个函数
function Person (name, age, sex) {
//(1)创建空对象 {}
//(2)将this指向这个对象 this = {}
//(3)对象赋值
this.name = name
this.age = age
this.sex = sex
//(4)返回这个对象 return this
}
let person1 = new Person('ikun', 32, '男')
let person2 = new Person('班长', 38, '男')
let person3 = new Person('王悦', 28, '男')
console.log(person1, person2, person3)
(3)原型对象
- 原型:任何构造函数在被创建的时候,系统都会自动帮我们创建一个与之对应的对象,称之为原型对象
- 同时解决内存浪费与全局变量污染的问题
- 谁可以访问原型对象中的成员(属性和方法)
- 构造函数自身:`构造函数名.prototype`
- 构造函数实例化的每一个对象:点语法直接访问
(4)__proto__属性介绍
- 1.属于对象,指向实例化这个对象的构造函数对应的原型 *
- 2.proto属性不是W3C标准,所以实际开发中一般不会使用它来访问原型,*
- 往原型添加属性方法,最好使用构造函数访问,一般用‘构造函数名.prototype’*
/*
1.prototype属性: 属于构造函数,指向原型对象
* 作用: 解决构造函数资源浪费+变量污染
2.__proto__属性: 属于实例对象,指向原型对象
* 作用: 可以让实例对象访问原型中的成员
*/
//1.构造函数
function Person (name, age) {
this.name = name
this.age = age
}
//2.原型对象
Person.prototype.eat = function () {
console.log('我中午真的吃了红烧鱼')
}
Person.prototype.country = '中国人'
//3.实例对象
let p1 = new Person('张三', 28)
console.log(p1)
/*
__proto__ : 属于实例对象,指向原型对象
*/
console.log( Person.prototype === p1.__proto__ )//true
(4)constructor属性介绍
/*
1. prototype : 属于构造函数,指向原型对象
* 作用:解决资源浪费+变量污染
2.__proto__ : 属于实例对象,指向原型对象
* 作用: 可以让实例对象访问原型中的成员
3.constructor: 属于原型对象,指向构造函数
* 作用: 可以让实例对象 知道自己被哪一个构造函数创建的
*/
//1.构造函数
function Person (name, age) {
this.name = name
this.age = age
}
//2.原型对象
Person.prototype.type = '哺乳动物'
Person.prototype.eat = function () {
console.log('吃东西')
}
//3.实例对象
let p1 = new Person('布丁', 3)
p1.eat()
console.log(p1.type)
/*
constructor : 属于原型对象,指向构造函数
作用:可以让实例对象知道自己被那个构造函数创建的
*/
(5)静态成员与实例成员
构造函数也可以有自己的属性: 例如prototype
静态成员 : 属于函数对象的成员
实例成员: 属于实例化对象的成员
//构造函数
function Person(name,age){
this.name = name;
this.age = age;
};
Person.aaa = '啊啊啊';
console.log(Person.aaa);//静态成员
//实例化对象
let p1 = new Person('张三',20);
console.log(p1.name);//实例成员
console.log(p1.age);//实例成员