js new 方法总结

简介: new一个对象的过程创建一个新对象 var obj = New Object()设置新对象的__proto__指向构造函数的prototype obj.__proto__ = ClassA.prototype改变this的指向,把this指向新创建的对象 ClassA.

new一个对象的过程

  1. 创建一个新对象 var obj = New Object()
  2. 设置新对象的__proto__指向构造函数的prototype obj.__proto__ = ClassA.prototype
  3. 改变this的指向,把this指向新创建的对象 ClassA.apply(obj, arguments)
  4. 返回改新对象 return obj
function MyNew(f) {
  return function() {
    var obj = new Object()
    obj.__proto__ = f.prototype
    f.apply(obj, argument)
    return obj
  }
}

 注意:若构造函数中返回this或返回值是基本类型(number、string、boolean、null、undefined)的值,则返回新实例对象;若返回值是引用类型的值,则实际返回值为这个引用类型。

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

var p1 = new Persion('bob', 23)
p1.name; // bob
p1.age; // 23

var p2 = MyNew(Person)('jack', 24)
p2.name; // jack
p2.age; // 24

优先级问题

优先级由高到低:小括号(xxx) > 属性访问. > new foo() > foo()

注意new Foo()优先级高于Foo();

function getName(){
    console.log(1)
}
function Foo() {
    this.getName = function () {
        console.log(2); 
    };
    return this;
}
Foo.getName = function () {
    console.log(3);
};
//先从.属性访问符号开始往前面找一个最近的对象,同时注意new Foo()优先于Foo();
var a=new Foo.getName();//3;
属性.的优先级高于new foo(),所以===new (Foo.getName)();返回Foo.getName类型的实例
var b=new Foo().getName();//2;
new foo()的优先级高于foo(),所以就相当于new foo()的属性,===(new Foo()).getName();返回undefined
var c=new new Foo().getName();//2;
new foo()优先级低于属性.,所以其实相当于就是new一个new foo()的getName属性函数,===new (new Foo().getName)();返回Foo.getName类型的实例
new Date().getTime();//===((new Date()).getTime)()
(new Date).getTime();//===((new Date()).getTime)()
new Date.getTime();//Uncaught TypeError: Date(...).getTime is not a function;===new (Date.getTime)()
相关文章
|
8天前
|
JavaScript 前端开发 索引
JavaScript中的数组的内置方法全面讲解
JavaScript 数组提供了多种内置方法来高效操作数据。如 `push()` 和 `unshift()` 分别在数组尾部和头部添加元素;`pop()` 和 `shift()` 则移除尾部和头部的元素;`splice()` 可增删元素;`slice()` 创建子数组;`join()` 将数组转化为字符串;`indexOf()` 和 `includes()` 用于查找元素;`forEach()` 遍历数组。此外,`reverse()` 和 `sort()` 改变数组顺序;`fill()` 填充数组值;`slice()` 和 `concat()` 则分别用于创建子数组和合并数组。
16 2
|
7天前
|
前端开发 JavaScript
JavaScript——promise 是解决异步问题的方法嘛
JavaScript——promise 是解决异步问题的方法嘛
14 0
|
7天前
|
JavaScript 前端开发 索引
js遍历的方法与区别
js遍历的方法与区别
18 3
|
4天前
|
JSON JavaScript 前端开发
JavaScript实现字符串转json对象的方法
JavaScript实现字符串转json对象的方法
|
3天前
|
JavaScript 测试技术 索引
js数组方法汇总
js数组方法汇总
6 1
|
4天前
|
JavaScript 前端开发 索引
JS - includes 方法和 map 方法使用方式
这篇文章介绍了JavaScript中数组的`includes`方法和`map`方法的用法,包括它们的语法、参数说明和具体的示例代码。`includes`方法用于判断数组是否包含特定元素,而`map`方法用于对数组中的每个元素执行操作并返回新数组。
9 1
|
8天前
|
JavaScript API 索引
js中的reduce()方法 讲解 和实现
`reduce()` 方法对数组元素依次应用一个回调函数,将结果累计并最终返回单一值。语法为 `reduce(callback(accumulator, currentValue, currentIndex, array), initialValue)`。参数包括累计器(初次为初始值或首元素)、当前元素值、索引及数组自身。此方法需返回值供下一轮迭代使用。常见应用场景包括计算数组总和与平均值、统计元素频率、过滤与转换数组内容及去除重复项等。例如,可通过 `reduce()` 快速计算 `[1, 2, 3, 4, 5]` 的总和或对对象属性值求和。此外,还可自定义实现 `reduce()` 方法
26 1
|
8天前
|
存储 JavaScript
js数组的创建的方法讲解
数组是ECMAScript中最常用的类型之一,它是一组有序数据的集合,每个位置可存储任意类型的数据,并且大小动态变化。创建数组可通过`new Array()`或数组字面量如`['苹果', '橘子']`。ES6引入了`Array.from()`和`Array.of()`:前者可将类数组或可迭代对象转为数组,后者则直接从参数创建数组。例如,`Array.from('hello')`将字符串转为字符数组,`Array.of('张三', '李四')`直接创建包含名字的数组。这些方法增强了处理数组的能力。
8 1
|
4天前
|
JavaScript 前端开发
javascript中常见获取时间戳的方法
javascript中常见获取时间戳的方法
10 0
|
4天前
|
JavaScript 前端开发
js中this是指向的哪个全局变量,改变this指向的方法有什么?
js中this是指向的哪个全局变量,改变this指向的方法有什么?
6 0