1.常用new的例子

  1. // Otaku 御宅族,简称宅
  2. function Otaku (name, age) {
  3. this.name = name;
  4. this.age = age;
  5. this.habit = 'Games';
  6. }
  7. // 因为缺乏锻炼的缘故,身体强度让人担忧
  8. Otaku.prototype.strength = 60;
  9. Otaku.prototype.sayYourName = function () {
  10. console.log('I am ' + this.name);
  11. }
  12. var person = new Otaku('Kevin', '18');
  13. console.log(person.name) // Kevin
  14. console.log(person.habit) // Games
  15. console.log(person.strength) // 60
  16. person.sayYourName(); // I am Kevin

从这个例子中,我们可以看到,实例 person 可以:

  1. 访问到 Otaku 构造函数里的属性
  2. 访问到 Otaku.prototype 中的属性

例二:

  1. // 返回值不是对象
  2. function Otaku (name, age) {
  3. this.strength = 60;
  4. this.age = age;
  5. return 'handsome boy';
  6. }
  7. var person = new Otaku('Kevin', '18');
  8. console.log(person.name) // undefined
  9. console.log(person.habit) // undefined
  10. console.log(person.strength) // 60
  11. console.log(person.age) // 18
  12. // 返回值是对象
  13. function Otaku (name, age) {
  14. this.strength = 60;
  15. this.age = age;
  16. return {
  17. name: name,
  18. habit: 'Games'
  19. }
  20. }
  21. var person = new Otaku('Kevin', '18');
  22. console.log(person.name) // Kevin
  23. console.log(person.habit) // Games
  24. console.log(person.strength) // undefined
  25. console.log(person.age) // undefined
  1. 判断返回的值是不是一个对象,如果是一个对象,我们就返回这个对象,如果没有,我们该返回什么就返回什么。

    2.实现

  1. const newDemo = function() {
  2. let obj = {}
  3. // 取出构造函数
  4. let Constructor = [].shift.call(arguments)
  5. // 将 obj 的原型指向构造函数,这样 obj 就可以访问到构造函数原型中的属性
  6. obj.__proto__ = Constructor.prototype
  7. // this指向当前 obj,并取到返回值
  8. let ret = Constructor.apply(obj, arguments)
  9. // 返回值是对象 就返回对象,其他的就相当于没返回,默认返回 obj
  10. return typeof ret === 'object' ? ret : obj
  11. }
  12. // 测试
  13. function Otaku (name, age) {
  14. this.name = name;
  15. this.age = age;
  16. this.habit = 'Games';
  17. }
  18. Otaku.prototype.strength = 60;
  19. Otaku.prototype.sayYourName = function () {
  20. console.log('I am ' + this.name);
  21. }
  22. let person = newDemo(Otaku, 'june', '18')
  23. console.log(person.name)
  24. console.log(person.habit)
  25. console.log(person.strength)
  26. person.sayYourName();
  1. 新建了一个对象 obj
  2. 取出第一个参数,就是我们要传入的构造函数。此外因为 shift 会修改原数组,所以 arguments 会被去除第一个参数
  3. 将 obj 的原型指向构造函数,这样 obj 就可以访问到构造函数原型中的属性
  4. 使用 apply,改变构造函数 this 的指向到新建的对象,这样 obj 就可以访问到构造函数中的属性
  5. 判断返回的值是不是一个对象,如果是一个对象,我们就返回这个对象,如果没有,我们该返回什么就返回什么。