js创建对象的方式:原型模式

本文围绕JavaScript展开,介绍了函数原型对象的相关概念,如函数创建时会有prototype属性指向原型对象,实例有指向构造函数原型对象的[[Prototype]]等。还阐述了判断对象关系、获取原型值等的一些方法,如isPrototypeOf()、Object.getPrototypeOf()等。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

代码

function Person(){
    
}
Person.prototype.name = 'Nicholas';
Person.prototype.age = 29;
Person.prototype.job = 'Software Engineer';
Person.prototype.sayName = function(){
    console.log(this.name);
};

var p1 = new Person();
p1.sayName();//Nicholas

var p2 = new Person();
p2.sayName();//Nicholas

console.log(p1.sayName == p2.sayName);//true
复制代码

相关概念

1).无论什么时候,只要创建了一个新函数,就会根据一组特定的规则为该函数创建一个prototype属性,这个属性指向函数的原型对象:Person.prototype

2).在默认情况下,所有的原型对象都会自动获得一个constructor(构造函数)属性,这个属性是一个指向prototype属性所在函数的指针:console.log(Person.prototype.constructor == Person);//true

3).当调用构造函数创建了一个新实例后,该实例的内部将包含一个指针(内部属性),指向构造函数的原型对象,这个指针叫做[[Prototype]],在脚本中没有标准的方式访问[[Prototype]],但是Firefox、Safari、Chrome在每个对象上都支持一个属性__proto__: console.log(p1.__proto__==Person.prototype);//true

4)实例都有一个constructor(构造函数)属性,该属性指向Person:console.log(p1.constructor == Person);//true

一些方法

  • isPrototypeOf():可以用来确定对象之间是否存在[[prototype]]关系
    console.log(Person.prototype.isPrototypeOf(p1));//true
    console.log(Person.prototype.isPrototypeOf(p2));//true
    复制代码
  • Object.getPrototypeOf():ECMAScript5新增的方法,返回[[prototype]]的值
    console.log(Object.getPrototypeOf(p1) == Person.prototype);//true
    console.log(Object.getPrototypeOf(p1).name);//Nicholas
    复制代码
  • hasOwnProperty():可以检测一个属性是存在实例中,还是存在原型中。当给定的属性存在于实例中返回true
    console.log(p1.name);//'Nicholas'
    console.log(p1.hasOwnProperty('name');//false
    p1.name = 'John';
    console.log(p1.name);//'John'
    console.log(p1.hasOwnProperty('name');//true
    复制代码
  • in:单独使用或者在for-in中使用。单独使用时,通过对象能 访问到给定的属性时返回true,无论该属性存在于原型还是实例中。
    console.log('name' in p1);//true
    console.log('fun' in p1);//false
    复制代码
  • Object.keys():得到实例上所有可以枚举的属性(不包含原型上的属性)。
    p1.like = 'food';
    Object.keys(p1);//['like']
    复制代码
  • Object.getOwnPropertyNames():得到实例的所有属性,无论是否可以枚举(不包含原型上的属性)。
    Object.defineProperty(p1, "key", {
      enumerable: false,
      configurable: false,
      writable: false,
      value: "static"
    });
    
    Object.keys(p1);//[]
    Object.getOwnPropertyNames(p1);//['key']
    复制代码
    分析:原型中所以的属性都被很多的实例共享,这种共享对于函数非常合适。但是对于包含引用类型值的属性来说,数据也被共享了,如:
    Person.prototype.arr = [1,2,3];
    p1.arr.push(4);
    console.log(p1.arr);//[1,2,3,4]
    console.log(p2.arr);//[1,2,3,4]
    复制代码

转载于:https://juejin.im/post/5ce16f82f265da1b7f294ea7

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值