javascript - 如何将原型函数传递给我的对象而不需要调用它?
问题描述
我正在创建一个注册产品并已经为每个产品分配唯一代码的脚本,该代码是通过codeGenerator
函数生成的。
我想知道如何将这个函数作为原型传递,而不需要调用函数来分配我的代码,或多或少是这样的:
Vacuum = registerProduct('LG - Vacuum Cleaner 3000','appliances','Super smart vacuum cleaner sucking: water, dust and souls','300')
返回一个对象:
APPLIANCES: Product {name: "LG - Vacuum Cleaner 3000", category: "appliances", description: "Super smart vacuum cleaner sucking: water, dust and souls", price: "R $: 300.00", code: "API- 01 "}
我以这种方式得到同样的出口:
const productsRegistered = {}
console.log(productsRegistered.length);
const Product = function( name, category, description, price, code) {
this.name = name
this.category = category
this.description = description
this.price = 'R$: ' + price + '.00'
this.code = codeGenerator(this.category)
}
function codeGenerator(productCategory) {
let productCode = ''
if (productCategory.length <= 3){
productCode = productCategory
} else {
productCode = sliceWords(productCategory)
}
if (typeof productList === 'undefined') {
productCode += '-01'
} else {
productCode += '-0' + productList.length + 1
}
return productCode
}
function registerProduct( name, category, description, price ) {
productsRegistered[category.toUpperCase()] = new Product(name,category,description,price)
}
function sliceWords(word) {
code = ''
for(let n = 0; n <= 5; n += 2) {
code += word[n].toUpperCase()
} return code
}
Computer = registerProduct('HP - ALL IN ONE','Computers and Laptops','HP Computer Entel Core i10','1500')
Vacuum = registerProduct('LG - Vacuum Cleaner 3000','appliances','Super smart vacuum cleaner sucking: water, dust and souls','300')
console.log(productsRegistered);
解决方案
您真正需要做的就是将productsRegistered
数组从数组更改为对象。如果您有一个数组,则在记录它们时这些项目不可见,因为它们不在数组索引属性上。
因为registerProduct
不返回任何东西,所以您不应该将返回值分配给变量 - 相反,检查productsRegistered
对象。
const productsRegistered = {};
const Product = function( name, category, description, price, code) {
this.name = name
this.category = category
this.description = description
this.price = 'R$: ' + price + '.00'
this.code = codeGenerator(productsRegistered)
}
function codeGenerator(productList) {
let productCode = ''
for (product in productList) {
let productCategory = productList[product].category
if (productCategory.length <= 3){
productCode = productCategory
} else {
productCode = sliceWords(productCategory)
}
if (productList.length === 0) {
productCode += '-01'
} else {
productCode += '-0' + productList.length + 1
}
} return productCode
}
function registerProduct( name, category, description, price ) {
productsRegistered[category.toUpperCase()] = new Product(name,category,description,price)
}
function sliceWords(word) {
code = ''
for(let n = 0; n <= 5; n += 2) {
code += word[n].toUpperCase()
} return code
}
registerProduct('HP - ALL IN ONE','Computers and Laptops','HP Computer Entel Core i10','1500')
registerProduct('LG - Vacuum Cleaner 3000','appliances','Super smart vacuum cleaner sucking: water, dust and souls','300')
console.log(productsRegistered);
或者,如果您确实希望产品在productsRegistered
对象和调用的返回值中可见registerProduct
,请将实例化的产品保存在变量中,以便您可以将其分配给对象并返回它:
const productsRegistered = {};
const Product = function(name, category, description, price, code) {
this.name = name
this.category = category
this.description = description
this.price = 'R$: ' + price + '.00'
this.code = codeGenerator(productsRegistered)
}
function codeGenerator(productList) {
let productCode = ''
for (product in productList) {
let productCategory = productList[product].category
if (productCategory.length <= 3) {
productCode = productCategory
} else {
productCode = sliceWords(productCategory)
}
if (productList.length === 0) {
productCode += '-01'
} else {
productCode += '-0' + productList.length + 1
}
}
return productCode
}
function registerProduct(name, category, description, price) {
const product = new Product(name, category, description, price);
productsRegistered[category.toUpperCase()] = product;
return product;
}
function sliceWords(word) {
code = ''
for (let n = 0; n <= 5; n += 2) {
code += word[n].toUpperCase()
}
return code
}
const computer = registerProduct('HP - ALL IN ONE', 'Computers and Laptops', 'HP Computer Entel Core i10', '1500')
const vacuum = registerProduct('LG - Vacuum Cleaner 3000', 'appliances', 'Super smart vacuum cleaner sucking: water, dust and souls', '300')
console.log(productsRegistered);
console.log(computer);
如果您希望对象的每个值productsRegistered
都是一个数组而不是一个对象,则在该属性处创建该数组(如果该属性尚不存在),然后推送给它:
const productsRegistered = {};
const Product = function(name, category, description, price, code) {
this.name = name
this.category = category
this.description = description
this.price = 'R$: ' + price + '.00'
this.code = codeGenerator(this.category)
}
function codeGenerator(productCategory) {
let productCode = ''
if (productCategory.length <= 3) {
productCode = productCategory
} else {
productCode = sliceWords(productCategory)
}
if (typeof productList === 'undefined') {
productCode += '-01'
} else {
productCode += '-0' + productList.length + 1
}
return productCode
}
function registerProduct(name, category, description, price) {
const product = new Product(name, category, description, price);
const key = category.toUpperCase();
if (!productsRegistered[key]) {
productsRegistered[key] = [];
}
productsRegistered[key].push(product);
return product;
}
function sliceWords(word) {
code = ''
for (let n = 0; n <= 5; n += 2) {
code += word[n].toUpperCase()
}
return code
}
const computer = registerProduct('HP - ALL IN ONE', 'Computers and Laptops', 'HP Computer Entel Core i10', '1500')
const vacuum = registerProduct('LG - Vacuum Cleaner 3000', 'appliances', 'Super smart vacuum cleaner sucking: water, dust and souls', '300')
console.log(productsRegistered);
console.log(computer);
推荐阅读
- react-native - Undefined 不是 _reactNavigation.StackNavigator 附近的函数
- python - 返回属性名称 Networkx Python
- php - 无法在 PHP 中循环遍历数组
- github - ssh正常时如何修复github权限被拒绝
- python - Flask IMAP 应用程序检索不必要和不正确的字符
- java - 如何遍历 Firebase 孩子的孩子并将他们的键添加到列表中?
- perl - 将对象引用存储在哈希键值中(在差异类中)并调用方法
- excel - VBA中的特殊IF/THEN语句和数据验证列表
- javascript - 如何将我的 React Table 的选定行数保存/存储到变量中?- 反应JS
- amazon-web-services - 限制 API 访问单个源 IP