国粹

文章 评论 浏览 27

国粹 2022-05-04 13:57:39

new 关键点

new 运算符创建一个用户定义的对象类型的实例或具有构造函数的内置对象的实例。new 关键字会进行如下的操作:

  • 创建一个空的简单JavaScript对象(即{});

  • 链接该对象(即设置该对象的构造函数)到另一个对象 ;

  • 将步骤1新创建的对象作为this的上下文 ;

  • 如果该函数没有返回对象,则返回this。 【很关键】


function Dog(name) {
  this.name = name
}

Dog.prototype.sayHi = function() {
  console.log('hello its me')
}

Dog.prototype.sayName = function() {
  console.log('my name is ' + this.name)
}

方法一

// 实现一个new
// 1,创建一个新的对象obj
// 2,将obj的__proto__指向Dog.prototype实现继承
// 3,执行构造函数,传递参数,改变this指向

// 方法一
function _new() {
  let args = arguments
  let constructor = Array.prototype.shift.call(args)
  const obj = new Object()
  Object.setPrototypeOf(obj, constructor.prototype)// 和下面一句是同样的效果
  // obj.__proto__ = constructor.prototype
  constructor.call(obj, ...args)
  return obj
}

方法二

function _new2(fn, ...arg) {
   // 这一句话只是构造了一个对象,这个对象的__proto__=== fn.prototype
   var obj = Object.create(fn.prototype)
   // 并没有给这个对象赋值,将fn的this对象设置为obj
   // call 是列表, apply是数组
   const ret = fn.call(obj, ...arg) 
   // 为啥这里需要判断一下ret,根据new的定义,如果构造函数没有返回一个对象,那么返回this对象,this当前就是obj
   return ret instanceof Object ? ret : obj 
}

第 14 题:情人节福利题,如何实现一个 new

国粹 2022-05-04 13:57:35

为什么setTimeout里面的setState就不能进行批处理?如果批处理会有什么异常,望解答。

第 18 题:React 中 setState 什么时候是同步的,什么时候是异步的?

国粹 2022-05-04 13:46:48

前来学习,大家没有疑问吗?
下面代码既然外面返回一个 promise,为什么不直接返回 promise,还要再包一个?是因为规范吗?

  if (self.status === 'resolved') {
    return promise2 = new Promise_(function (resolve, reject) {
      try {
        var x = onResolved(self.data)
        if (x instanceof Promise_) { 
          x.then(resolve, reject)
        }
        resolve(x) 
      } catch (e) {
        reject(e) 
      }
    })
  }

改为

  if (self.status === 'resolved') {
    var x
    try {
      var x = onResolved(self.data)
    } catch (e) {
      reject(e)
    }
    
    if (x instanceof Promise_) {
      return x
    } else {
      return promise2 = new Promise_(function (resolve, reject) {
        try {
          resolve(x)
        } catch (e) {
          reject(e)
        }
      })
    }

我也有这个疑问,我猜测是,then 里返回的是一个 新 promise 对象 p2, 那么肯定需要 p2 调用了 resovle 函数,后面链式的 then 里的函数才能执行。 如果直接 resolve(x), 那么相当于把 x 这个promsie 对象传递给了 then 参数,这肯定不符合预期。 个人理解写成var x = onResolved(self.data); if ( x instanceof Promise) { x.then(data => resolve(data)); } else { resolve(x); }
可能更好理解一些。

剖析 Promise 内部结构,一步一步实现一个完整的、能通过所有 Test case 的 Promise 类

国粹 2022-05-04 13:27:21

看了楼顶的链接,知道了AST,还是很开心的。

第 65 题: a.b.c.d 和 a['b']['c']['d'] 哪个性能更高?

更多

推荐作者

櫻之舞

文章 0 评论 0

弥枳

文章 0 评论 0

m2429

文章 0 评论 0

野却迷人

文章 0 评论 0

我怀念的。

文章 0 评论 0

    我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
    原文