搜索
Javascript的原型与继承:为什么对象不能调用Object的方法
巴扎黑
巴扎黑 2017-04-10 15:47:10
[JavaScript讨论组]

JS中,所有对象都继承了Object对象, 那么为什么对象不可以调用Object上的方法呢?
例如

var obj = {};
var o = obj.create(Object); // 出错, 但使用Object.create()可以
var o1 = obj.getPrototypeOf(obj);  //出错, 但使用Objcet.getPrototypeOf()可以

既然都继承了Object对象, 那么还不能使用它的方法, Why?
(我知道它们可以使用Object.prototype的方法)

巴扎黑
巴扎黑

全部回复(8)
阿神

create 和 getPrototypeOf 是 Object 类的成员,不在原型链上,非 Object 实例的成员,是 类方法

js 中,对于类上的成员方法是访问不到的,对于一个类实例,仅能访问原型链上的方法以及用obj.func = function...直接赋值的函数

PHPz

形如:

Object.msg

是静态方法,可以这样调用

Object.msg('demo');

而:

Object.prototype.msg

是实例方法,需要它的实例来调用

var obj = new Object;
obj.msg('demo');
PHP中文网

所有对象都继承了Object对象

这话谁说的?吊起来打丫的!!!

为什么对象不可以调用Object上的方法呢?

因为 Object 不在对象的原型链上

var obj = {}

obj 的原型链:

obj ------>  Object.prototype -------> null
ringa_lee

继承的只是prototype上的方法,Object 是一个函数create是这个函数的方法而不是他prototype上的方法

高洛峰

对新手要这么说

(我知道它们可以使用Object.prototype的方法)

你这不都知道了么,没有为什么,语法规定

obj.create 试图继承的是 Object.pototype.create 不是 Object.create
obj.属性 要访问的是 obj.属性 或是 obj.__proto__.属性 或是obj.__proto__.__proto__.属性。。。。。这是一个复杂的问题
http://segmentfault.com/q/1010000003694233/a-1020000003694325
你现在要弄明白的是 下面结果是 true的原因

PHPz

简而言之,就是原型方法与静态方法的区别。

我突然联想到了java中static关键字囧。。。

巴扎黑

涉及到原型继承的问题

var obj = {} 换句话说就是 var obj = new Object()创建的,因此obj是由Object构造函数创建的对象。

因为ECMAscript的发明者为了简化这门语言,同时又保持继承性,采用了链式继承的方法,即由构造函数(constructor)创建的对象实例都有个_proto_属性,这个属性只指向constructor.prototype,因此对象实例只会继承constrcutor.prototype上定义的属性和方法。

拿到本题来说就是,obj只能继承Object.prototype上的方法。而Object.creatObject.getPrototypeof是互相并列的方法,所以不能被访问到。

迷茫

debug看下调试信息 展开 原形链 就明白了

热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责申明 意见反馈 讲师合作 广告合作 最新更新 English
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送
PHP中文网APP
随时随地碎片化学习
PHP中文网抖音号
发现有趣的

Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号