小白请教关于原型方面的一些疑问?

  1. 写 JS 的时候 经常用到 new Date() 然后才使用 new Date 的方法,但是为啥数组 和字符串的方法不用 new Array()new Object()new String(),也可以直接 .length.forEach.split
  2. 为啥要加一些全局方法百度很多都是通过原型链 xxx.prototype.functionName 加,new Date().functionName 也可以呀?

求大佬们解惑

阅读 1.6k
3 个回答

1 [] 是 Array 对象,{} 是 Object 对象,"foo" 是 String 对象。但是不通过 new Date() 没法得到一个 Date 对象。

2 new Date().function 添加的只是在这个一个 Date 对象上,并不会影响其它 Date 对象。通过xx.prototype.function 会影响所有 xx 对象。

  1. 因为这些类型的构建构成 js 运行时帮你做了,不需要你再显式的做一遍。实际上你想 new String 也没问题
  2. 现在可以直接使用 class,不一定非要用原型链,但你最好了解原型链。至于new Date().a = 'foo',其实没有走原型链,新属性在新对象上。

[] 只是 new Array() 的别名

你要是想,写个简单的编译器,自定义别名也不是不可以

const compiler = code => new Function(
  code
    .replace(/s(\[.*])s/ig, (_, v) => `new Set(${ v })`)
    .replace(/m({.*})m/ig, (_, v) => `new Map(Object.entries(${ v }))`)
).call(window)

compiler(`
  console.log('new Set', s[1, 2, 3]s)
  console.log('new Map', m{a: 1, b: 2}m)
`)

原型链定义的用法区别在类实例的理解上

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题