本文共 2284 字,大约阅读时间需要 7 分钟。
在JavaScript中,对象可以通过三种方式创建:
对象字面量:直接在代码中定义对象的结构。例如:
var obj = { name: '张三', age: 20};
这种方式高效,适合少量对象的创建。
使用new Object()创建:这种方法创建一个空对象,然后手动添加属性。例如:
var obj = new Object();obj.name = '张三';obj.age = 20;
自定义构造函数:通过函数返回一个新的对象实例。例如:
function People(name, age) { this.name = name; this.age = age; this.sing = function() { console.log('唱歌了!'); };}var person = new People('张三', 20);
JavaScript允许在函数中通过this
添加实例成员,而静态成员则是函数本身或原型上的属性。例如:
function People(name, age) { this.name = name; this.age = age;}var a = new People('张三', 20);console.log(a.name); // 输出"张三"
function People(name, age) { this.name = name; this.age = age;}People.maxAge = 30; // 静态成员console.log(People.maxAge); // 输出30
每个构造函数都有一个prototype
属性,用于定义公共的方法和属性。这些方法会被所有实例共享。例如:
在构造函数中定义方法:
function People(name, age) { this.name = name; this.age = age; this.sing = function() { console.log(this.name + '唱歌了!'); };}
通过原型共享方法:
var a = new People('张三', 20);var b = new People('李四', 30);console.log(a.sing === b.sing); // true,两个实例共享同一方法
原型对象的作用是避免重复存储方法,提高内存效率。
每个实例都有__proto__
属性,指向它的构造函数的原型。例如:
var a = new People('张三', 20);console.log(a.__proto__ === People.prototype); // true
当访问实例属性时,JavaScript会从__proto__
中继而查找原型对象的属性。
构造函数的prototype
属性也包含一个constructor
,指回构造函数本身。这允许原型对象通过constructor
重新指向正确的构造函数。
JavaScript在查找对象属性时,会首先检查构造函数,然后检查原型对象,最后是更高层的原型。例如:
Object.prototype.sex = '对象性别';People.prototype.sex = '实例性别';var a = new People('张三', 20);console.log(a.sex); // 输出"实例性别"
原型对象中的方法在被调用时,其this
会指向当前的对象实例。例如:
function People(name, age) { this.name = name; this.age = age; console.log('构造函数中的this:', this);}People.prototype.say = function() { console.log('原型对象中的this:', this);}var a = new People('张三', 20);a.say(); // this指向对象a
可以通过原型对象扩展内置对象的功能。例如,给Array添加求和方法:
Array.prototype.sum = function() { var total = 0; for (var i = 0; i < this.length; i++) { total += this[i]; } return total;}var arr = new Array(10, 20, 30);console.log(arr.sum()); // 输出60
通过理解和实践这些概念,JavaScript开发者能够更高效地构建和维护对象类型,充分利用原型机制优化代码性能。
转载地址:http://srhmz.baihongyu.com/