为什么对象不能调用Object的方法?

JS中所有对象都是继承Object对象的。所以String对象也有toString()方法。
但是下面的情况:

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

为什么obj对象就不能使用Object的create方法?
我们要明白对象继承的是原型对象的属性和方法,构造函数的属性和方法是不会出现在原型链上的。
我们来看看Object的原型对象

console.log(Object.prototype);
console.log(Object.getOwnPropertyNames(Object.prototype));
//此方法返回Object.prototype所有属性和方法所组成的字符数组。


这里写图片描述
可以看到在原型对象中只有这些方法,所有对象都可以继承,而create实质上是Object这个构造函数的方法,只能通过Object来调用。
Obejct构造函数(constructor)的方法。Object构造函数的方法



来创建一个简单的例子

function Test(){

}
Test.prototype.protoName = "protoName";
Test.testName = "testName";

var obj = new Test();

console.log(obj.protoName); //protoName
console.log(obj.testName);  //undefined
console.log(Test.testName); //tessName

obj继承的是原型链上的属性和方法。
obj的属性是在原型链上寻找的,当obj没有找到时,就会去obj的原型对象上找,obj的原型对象上没有找到,就会去obj的原型对象的原型对象上找,找到就返回其属性。找到最后还没找到就返回undefined。
testName属性在对象和原型链上都没找到,所以就返回了undefined。



js 对象方法、类方法、原型方法的区别;私有属性、公有属性、公有静态属性的区别。

<html>
    <head>
    <meta http-equiv="Content-Type" content="text/html; charset=utf-8">
        <title>test</title>
    </head>
    <body>
        <script>
        //对象构造函数
        function Atest(name){
            //私有属性,只能在对象构造函数内部使用
            var className = "Atest";
            //公有属性,在对象实例化后调用
            this.name = name;
            //对象方法
            this.hello = function(){
                alert(this.name);
                alert(this.msg());//使用原型方法扩充的方法可以在类内部使用
                alert(this.sex);//使用原型方法扩充的属性可以在类内部使用
                alert(Atest.age);//静态属性调用时格式为[对象.静态属性]
            }
        }
        //类方法 (实际是静态方法直接调用) 位置:Atest类的外部 语法格式:类名称.方法名称 = function([参数...]){ 语句行; }
        Atest.Run = function(){
            alert("我是类方法 Run");
        }


        //原型方法
        Atest.prototype.msg = function(){
            alert("我的名字是:"+this.name);//如果原型方法当作静态方法直接调用时,this.name无法被调用
        }

        //公有静态属性 在类的外部
        Atest.age = 20;//公有静态属性不能使用 【this.属性】,只能使用 【对象.属性】 调用

        //原型属性,当作是类内部的属性使用【this.原型属性】,也可以当成公有静态属性使用【对象.prototype.原型属性】
        Atest.prototype.sex = "男";

        Atest.Run(); //类方法也是静态方法,可以直接使用 【对象.静态方法()】
        Atest.prototype.msg();//原型方法当成静态方法使用时【对象.prototype.方法()】 
        alert(Atest.prototype.sex);//原型属性当作静态属性使用时【对象.prototype.方法()】
        var a = new Atest("zhangsan");//对象方法和原型方法需要实例化对象后才可以使用
        a.hello();//对象方法必须实例化对象
        a.msg();//原型方法必须实例化对象
        alert(a.age)://错误,公有静态属性只能使用 【对象.属性】调用

        //ps:尽量将方法定义为原型方法,原型方法避免了每次调用构造函数时对属性或方法的构造,节省空间,创建对象快。类实际上是JS通过构造函数模拟的。
    </script>
    </body>
</html>

参考链接:js 对象方法、类方法、原型方法的区别;私有属性、公有属性、公有静态属性的区别

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值