构造函数
// 构造函数,函数名首字母大写,调用用new创建一个对象实例
// 使用new关键字创建的都是对象,后面调用得都是构造方法
function Person(name,age) { // 参数可根据需要写 this.name = name; // this的指向为对象实例 this.age = age; this.eat = function() { console.log(this.name +'吃饭饭'); } } let person1 = new Person('阿三','18') // 在创建对象实例的时候传入值
工厂模式
function personCopy(name,age) { let obj = new Object(); obj.name = name ; obj.age = age; return obj } // 调用 let person3 = personCopy('a五',19)
原型链
对象寻找属性的过程
// prototype这个空间是一个对象,可以存放对应的数据,且是函数的,不是对象的 // prototype就是原型 function PersonSon() { PersonSon.prototype.age = 18 PersonSon.prototype.eat = function() { console.log('吃饭'); } } let person4 = new PersonSon(); console.log(person4.age); // __proto__属于对象的属性 // 对象的__proto__指向对应构造函数的prototype // 对象可以通过__proto__来访问构造函数的prototype console.log( person4.__proto__); // {age: 18, eat: ƒ, constructor: ƒ} // 构造方法的prototype与对象的__proto__值相等 console.log(PersonSon.prototype == person4.__proto__); // true let person5 = new PersonSon(); console.log(person5.age); console.log(person4.eat === person5.eat); // 将方法设置到prototype里,对应的方法就只会有一个 // 原型链(它是个过程):对应的对象的属性,先去找自己的__proto__是否存在,找的到就读取 // 找不到就会往上找(找父亲的构造函数),直到找到Object顶层对象,找到就返回值,找不到就返回undefined console.log(person4.name); // 设置不遵循原型链 person4.name = '阿六'; // 设置值不会添加到prototype里面 console.log(PersonSon.prototype.name); // undefined console.log(person4.__proto__.name); // undefined console.log(person4.name); // 阿六