Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

重学js —— 基本对象:普通对象(原型对象属性和对象实例属性) #107

Open
lizhongzhen11 opened this issue May 5, 2020 · 0 comments
Labels
js基础 Good for newcomers 重学js 重学js系列 规范+MDN

Comments

@lizhongzhen11
Copy link
Owner

lizhongzhen11 commented May 5, 2020

基本对象:普通对象(原型对象属性和对象实例属性)

原型对象:

  • 就是固有对象 %ObjectPrototype%
  • 有个 [[Extensible]] 内置插槽,值为 true
  • 有为普通对象定义的内置方法,除了 [[SetPrototypeOf]] 方法(它是一个 不变的原型怪异对象
  • 有个 [[Prototype]] 内置插槽,值为 null

Object.prototype.constructor

初始值就是 %Object%

Object.prototype.hasOwnProperty ( V )

let o = new Object();
o.hasOwnProperty('prop'); // 返回 false
o.prop = 'exists';
o.hasOwnProperty('prop'); // 返回 true
o.hasOwnProperty('toString'); // 返回 false
  1. 定义 P? ToPropertyKey(V)
  2. 定义 O? ToObject(this 值)
  3. 返回 ? HasOwnProperty(O, P)

Object.prototype.isPrototypeOf ( V )

function Foo() {}
function Bar() {}
function Baz() {}

Bar.prototype = Object.create(Foo.prototype);
Baz.prototype = Object.create(Bar.prototype);

var baz = new Baz();

console.log(Baz.prototype.isPrototypeOf(baz)); // true
console.log(Bar.prototype.isPrototypeOf(baz)); // true
console.log(Foo.prototype.isPrototypeOf(baz)); // true
console.log(Object.prototype.isPrototypeOf(baz)); // true

// instanceof 见 https://github.com/lizhongzhen11/lizz-blog/issues/75
baz instanceof Baz // true
baz instanceof Bar // true
baz instanceof Foo // true
baz instanceof Object // true
  1. 如果 V 不是对象,返回 false
  2. 定义 O? ToObject(this 值)
  3. 重复,
    1. 设置 V? V.[[GetPrototypeOf]]()
    2. 如果 Vnull,返回 false
    3. 如果 SameValue(O, V) 为 true,返回 true

Object.prototype.propertyIsEnumerable ( V )

没见过,第一次认识。关键连IE都支持。。。

var o = {};
var a = [];
o.prop = 'is enumerable';
a[0] = 'is enumerable';

o.propertyIsEnumerable('prop'); // 返回 true
a.propertyIsEnumerable(0); // 返回 true
a.propertyIsEnumerable('length'); // 返回 false
  1. 定义 P? ToPropertyKey(V)
  2. 定义 O? ToObject(this 值)
  3. 定义 desc? O.[[GetOwnProperty]](P)
  4. 如果 descundefined,返回 false
  5. 返回 desc.[[Enumerable]]

注意:此方法不考虑原型链中的对象。

Object.prototype.toLocaleString ( [ reserved1 [ , reserved2 ] ] )

  1. 定义 Othis 值
  2. 返回 ? invoke(O, "toString")

该函数的可选参数不使用,而是与 ECMA-402 toLocaleString 函数所使用的参数模式相对应。不包括ECMA-402支持的实现方案不得将这些参数位置用于其他目的。

Object.prototype.toString ( )

  • MDN
  • %ObjProto_toString% 固有对象
var o = new Object();
o.toString(); // [object Object]

function a() {
  console.log(Object.prototype.toString.call(arguments))
}
a(); // [object Arguments] 
  1. 如果 this 值是 undefined,返回 "[object Undefined]"
  2. 如果 this 值是 null,返回 "[object Null]"
  3. 定义 O! ToObject(this 值)
  4. 定义 isArray? isArray(O)
  5. 如果 isArraytrue,定义 builtinTag"Array"
  6. 如果 O[[ParameterMap]] 内置插槽,定义 builtinTag"Arguments"
  7. 如果 O[[Call]] 内置方法,定义 builtinTag"Function"
  8. 如果 O[[ErrorData]] 内置插槽,定义 builtinTag"Error"
  9. 如果 O[[BooleanData]] 内置插槽,定义 builtinTag"Boolean"
  10. 如果 O[[NumberData]] 内置插槽,定义 builtinTag"Number"
  11. 如果 O[[StringData]] 内置插槽,定义 builtinTag"String"
  12. 如果 O[[DateValue]] 内置插槽,定义 builtinTag"Date"
  13. 如果 O[[RegExpMatcher]] 内置插槽,定义 builtinTag"RegExp"
  14. 否则,定义 builtinTag"Object"
  15. 定义 tag? Get(O, @@toStringTag)
  16. 如果 tag 不是字符串,设置 tagbuiltinTag
  17. 返回 "[object ", tag"]" 的字符串拼接

注意,Map 以及 Set 等在这里走的是第15步。

Object.prototype.valueOf ( )

  • MDN
  • %ObjProto_valueOf% 固有对象
  1. 返回 ? ToObject(this 值)

对象实例属性

对象实例除了从原型对象继承的属性外,没有其他特殊属性。

@lizhongzhen11 lizhongzhen11 added js基础 Good for newcomers 重学js 重学js系列 规范+MDN labels May 5, 2020
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
js基础 Good for newcomers 重学js 重学js系列 规范+MDN
Projects
None yet
Development

No branches or pull requests

1 participant