先说构造函数
比如我想创建很多个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