JS中,所有对象都继承了Object对象, 那么为什么对象不可以调用Object上的方法呢?
例如
var obj = {};
var o = obj.create(Object); // 出错, 但使用Object.create()可以
var o1 = obj.getPrototypeOf(obj); //出错, 但使用Objcet.getPrototypeOf()可以
既然都继承了Object对象, 那么还不能使用它的方法, Why?
(我知道它们可以使用Object.prototype的方法)
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号
create 和 getPrototypeOf 是 Object 类的成员,不在原型链上,非 Object 实例的成员,是 类方法
js 中,对于类上的成员方法是访问不到的,对于一个类实例,仅能访问原型链上的方法以及用obj.func = function...直接赋值的函数
形如:
是静态方法,可以这样调用
而:
是实例方法,需要它的实例来调用
这话谁说的?吊起来打丫的!!!
因为
Object
不在对象的原型链上obj
的原型链:继承的只是prototype上的方法,Object 是一个函数create是这个函数的方法而不是他prototype上的方法
对新手要这么说
你这不都知道了么,没有为什么,语法规定
obj.create
试图继承的是Object.pototype.create
不是Object.create
obj.属性
要访问的是obj.属性
或是obj.__proto__.属性
或是obj.__proto__.__proto__.属性
。。。。。这是一个复杂的问题http://segmentfault.com/q/1010000003694233/a-1020000003694325
你现在要弄明白的是 下面结果是
true
的原因简而言之,就是原型方法与静态方法的区别。
我突然联想到了java中static关键字囧。。。
涉及到原型继承的问题
var obj = {}
换句话说就是var obj = new Object()
创建的,因此obj是由Object构造函数创建的对象。因为ECMAscript的发明者为了简化这门语言,同时又保持继承性,采用了链式继承的方法,即由构造函数(constructor)创建的对象实例都有个
_proto_
属性,这个属性只指向constructor.prototype
,因此对象实例只会继承constrcutor.prototype
上定义的属性和方法。拿到本题来说就是,
obj
只能继承Object.prototype
上的方法。而Object.creat
和Object.getPrototypeof
是互相并列的方法,所以不能被访问到。debug看下调试信息 展开 原形链 就明白了