Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/464.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript JS:在创建工厂函数而不是类时,如何创建原型?_Javascript_Factory - Fatal编程技术网

Javascript JS:在创建工厂函数而不是类时,如何创建原型?

Javascript JS:在创建工厂函数而不是类时,如何创建原型?,javascript,factory,Javascript,Factory,如果我正在创建工厂函数,我将如何创建原型以避免新对象的每个实例继承每个属性 function Person(name) { function indentify() { return "I am " + name } return Object.freeze({ name, indentify }) } 如果我想创建一个Person对象而不

如果我正在创建工厂函数,我将如何创建原型以避免新对象的每个实例继承每个属性

    function Person(name) {
        function indentify() {
           return "I am " + name
        }

        return Object.freeze({
            name,
            indentify

        })

    }
如果我想创建一个Person对象而不让所有对象都包含identify,那么我可以使用工厂函数还是必须使用类语法

function Person(name) {

  this.name = name;

}

Person.prototype.indentify = function() {
  return "I am " + this.name
}

离题了,我想你是在找单词
identify

我会制作构造函数并将identify添加到原型中,如下所示:

function Person(name) {

    this.name = name; 
    Object.freeze(this)

}

Person.prototype.indentify = function() {
       return "I am " + this.name
}
创造一个像这样的新人

var person = new Person('John')

如何将功能组合到person上。例如:

const createPerson=(name)=>({name})
const with identify=(person)=>({…person,identify:()=>`我是${person.name}`)
let person=createPerson('Chris')
console.log(person)/{name:'Chris'}
person=with标识(person);
console.log(person)/{name:'Chris',标识:f}
console.log(person.identify())/“我是克里斯”

如果您决定,您甚至可以使用部分执行来清理
with identify
函数。

如果您想继续使用factory函数并避免使用
new
操作符,您可以使用创建具有特定原型的对象:

const personProto = {
    identify() {
        return "I am " + this.name; // needs to access the property of course, there's no closure
    }
};
function Person(name) {
    return Object.freeze(Object.assign(Object.create(personProto), {name}));
}

你的意思是“不让所有人都创造一个新的身份”?嘿,埃弗特。使用该代码并设置l
et me=Person(“Albert”)
时,我收到一个错误,然后
me.identify()
抛出一个错误,表示无法读取的属性undefined@Curly您应该调用
const me=new Person('Albert')
;。我认为工厂功能不需要新的<代码>工厂函数是任何不是返回(可能是新的)对象的类或构造函数的函数。在JavaScript中,任何函数都可以返回一个对象。如果不使用new关键字,则它是一个工厂函数。-@Curly您可以将new与工厂函数一起使用。不过,在本例中,您根本不需要工厂函数allthanker@Bergi。要做到这一点似乎需要很多,对吗?这就是为什么类语法很有吸引力吗?@Curly不,不是真的<代码>类语法不创建冻结实例,因此没有
对象.冻结
,您必须通过赋值而不是使用对象文字语法创建属性,因此没有
对象.赋值
:-)