- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我只是看着道格拉斯·克罗克福德(Douglas Crockford)谈论原型(prototype)继承如何“也不是一个好主意”。
YouTube 35m55s
我真的不在乎他对JavaScript与原型(prototype)继承的看法,因为它是语言的重要组成部分,它将永远存在。
但是我想知道我通过使用链接中显示的功能对象创建而获得的好处:
// Class Free Object Oriented Programming
function constructior(init) {
var that = other_constructor(init),
member,
method = function () {
// init, member, method
};
that.method = method;
return that;
}
function Constructor (value) {
var private = value;
this.getPrivate = function () {
return private;
}
}
var OBJ1 = new Constructor(5);
var OBJ2 = new Constructor('bacon');
console.log( OBJ1.getPrivate() ); // 5
console.log( OBJ2.getPrivate() ); // bacon
new
关键字的省略。通过避免使用
new
关键字,我们可以避免忘记
new
关键字的错误。
var panda = createBear();
var panda = new Bear();
new
关键字会很有用,我可以采用功能模式。
最佳答案
好了,我将在这里尝试用我收到的信息以及提出问题后在互联网上收集到的其他信息回答我自己的问题。
TL; DR:
它们都是有用的,并且可以实现大多数相同的事情。构造函数可以访问其原型(prototype),这非常有用,因为这意味着它们在使用构造函数创建的所有实例中都具有“全局”值。它既有用又有潜在危险。之所以有用,是因为构造函数的所有实例都可以访问相同的原型(prototype)属性,从而避免了重复。危险,因为您可以覆盖构造函数属性或,为该实例提供相同名称的属性-使其更难访问原型(prototype)值。
调用Constructor时有忘记new
关键字的危险,但是可以通过在Constructor函数内部添加"use strict";
来轻松解决,如果您忘记new
关键字,则会引发错误。
如果要避免原型(prototype)及其功能/危险,可以使用工厂
功能。
“功能性”方法真正有用的功能是可以返回任何您喜欢的东西。而不是总是构造预定义对象的“子代”。
我从这一切中学到的是,当您同时使用两者时,选择一个来另一个是愚蠢的。他们都有自己的长处和短处,人们需要记住道格拉斯·克罗克福德只是一个人,而不是JavaScript的上帝。 (那是Brandon Eich,大声笑!)
@Domenic在What difference is there in JavaScript between a constructor function, and function returning object which is invoked as a constructor?上接受的答案
让我对两种对象创建方法之间的异同有一些见解。
build 者
使用new
关键字在新对象与其派生的构造函数对象之间创建链接。构造函数是新对象的原型(prototype),而新对象是原型(prototype)对象的实例。
var Constructor = function () {
this.x = 0;
this.y = 0;
};
var A = new Constructor();
console.log(A instanceof Constructor ); // true
Constructor.prototype.color = 'yellow';
.color
属性,而无需将其存储在内部。
var A = new Constructor();
console.log(A.color); // yellow
console.log(A.hasOwnProperty('color')); // false
var A = new Constructor();
Constructor.prototype.food = 'bacon';
console.log(A.food); // bacon;
Constructor.prototype.number = 5;
A.calculate = function () {
return A.number * 5;
}
console.log(A.calculate()); // 25
Constructor.prototype.number = 'fishsticks';
console.log(A.calculate()); // NaN
.__proto__.
或新的
Object.getPrototypeOf()
方法。
console.log(Object.getPrototypeOf(A.color)); // yellow
new
。如果您忘记在构造函数的前面编写
new
,它将运行构造函数而不是创建新对象。
var A = Constructor();
console.log(A); // undefined
new
关键字,则会抛出错误。
var Constructor = function () {
"use strict";
this.x = 0;
this.y = 0;
}
var A = Constructor();
console.log(A);
// Uncaught TypeError: Cannot set property 'x' of undefined
new
关键字以及Constructor函数的某些“危险”,则可以使用这种方法创建不使用其原型(prototype)的对象。
function factory () {
var obj = {
x: 0,
y: 0
}
return obj;
}
var A = factory(); // {x: 0, y: 0}
function factory () {
if ( new Date().getHours() < 8 ) {
return "can't create object. Need Coffe!"
};
var obj = {
x: 0,
y: 0
}
return obj;
}
var A = factory(); // Before 8 am: "can't create object. Need Coffe!"
var A = factory(); // After 8 am: {x: 0, y: 0};
factory.prototype.foo = "bar";
A = factory();
console.log(A.foo); // undefined
关于javascript - 用JavaScript创建功能对象的优点/缺点是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23158732/
我是一名优秀的程序员,十分优秀!